springboot系列09:jpa的高级使用2

限制查询

  • 查询取前一个实体

1
2
3
<br>    /**<br>    * 取年龄最大
 */
User findTopByOrderByAgeDesc();

 

  • 测试类

1
2
3
4
@Test
 public void testFindTopByOrderByAgeDesc(){
     Assert.assertEquals(30,(int)userRepository.findTopByOrderByAgeDesc().getAge());
 }

 

 

自定义查询

使用自定义的 SQL 来查询,在 SQL 的查询方法上面使用@Query注解,如涉及到删除和修改在需要加上@Modifying.也可以根据需要添加 @Transactional对事物的支持,查询超时的设置等

 

  • 更新语句

1
2
3
4
5
6
7
/**
 * 更新用户名
 */
@Transactional
@Modifying
@Query("update com.example.jpa.domain.User u set u.userName = ?1 where u.id = ?2")
int updateUserNameById(String  userName, Long id);

 

  • 测试类

1
2
3
4
@Test
public void testUpdateUserNameById(){
    Assert.assertEquals(1,userRepository.updateUserNameById("zhangliang",12L));
}

 

 

 

  • 自定义查询

1
2
3
4
5
/**
 * 用户名模糊查询
 */
@Query("select u from com.example.jpa.domain.User u where u.userName like ?1")
List<User>  findByUserNameLike(String userName);

 

  • 测试

1
2
3
4
@Test
public void testFindByUserNameLike(){
    Assert.assertEquals(2,userRepository.findByUserNameLike("%zhang%").size());
}

 

 

 

 

  • 删除

1
2
3
4
5
6
7
/**
 * 删除
 */
@Transactional
@Modifying
@Query("delete from com.example.jpa.domain.User where id = ?1")
int deleteByUserId(Long id);

 

  • 测试

1
2
3
4
@Test
 public void testDeleteByUserId(){
     Assert.assertEquals(0,userRepository.deleteByUserId(0L));
 }

 

 

 

多表查询

第一种利用 Hibernate 的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果

 

第一种实现:

  • 定义爱好类,实现一个用户有多个爱好

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.example.jpa.domain;
 
import lombok.Data;
 
import javax.persistence.*;
import java.io.Serializable;
 
@Data
@Entity(name = "tb_hobby")
public class Hobby  implements Serializable {
 
    @Id
    @GeneratedValue
    private Long id;
 
    @Column(nullable = false, unique = true)
    private String name;
}

 

  • 用户类添加映射关系

1
2
3
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name="user_id",referencedColumnName="id")
private List<Hobby> hobbies;

 

  • 自定义查询

1
2
@Query("select u from com.example.jpa.domain.User u where u.id=?1")
User findUserHobby(Long id);

 

  • 测试

1
2
3
4
@Test
public void testFindUserHobby(){
    Assert.assertEquals(2,userRepository.findUserHobby(1L).getHobbies().size());
}

 

 

posted @   IT6889  阅读(146)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示