限制查询
-
查询取前一个实体
/**
* 取年龄最大 */ User findTopByOrderByAgeDesc();
-
测试类
@Test public void testFindTopByOrderByAgeDesc(){ Assert.assertEquals(30,(int)userRepository.findTopByOrderByAgeDesc().getAge()); }
自定义查询
使用自定义的 SQL 来查询,在 SQL 的查询方法上面使用@Query
注解,如涉及到删除和修改在需要加上@Modifying
.也可以根据需要添加 @Transactional
对事物的支持,查询超时的设置等
-
更新语句
/** * 更新用户名 */ @Transactional @Modifying @Query("update com.example.jpa.domain.User u set u.userName = ?1 where u.id = ?2") int updateUserNameById(String userName, Long id);
-
测试类
@Test public void testUpdateUserNameById(){ Assert.assertEquals(1,userRepository.updateUserNameById("zhangliang",12L)); }
-
自定义查询
/** * 用户名模糊查询 */ @Query("select u from com.example.jpa.domain.User u where u.userName like ?1") List<User> findByUserNameLike(String userName);
-
测试
@Test public void testFindByUserNameLike(){ Assert.assertEquals(2,userRepository.findByUserNameLike("%zhang%").size()); }
-
删除
/** * 删除 */ @Transactional @Modifying @Query("delete from com.example.jpa.domain.User where id = ?1") int deleteByUserId(Long id);
-
测试
@Test public void testDeleteByUserId(){ Assert.assertEquals(0,userRepository.deleteByUserId(0L)); }
多表查询
第一种利用 Hibernate 的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果
第一种实现:
-
定义爱好类,实现一个用户有多个爱好
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; }
-
用户类添加映射关系
@OneToMany(fetch=FetchType.EAGER) @JoinColumn(name="user_id",referencedColumnName="id") private List<Hobby> hobbies;
-
自定义查询
@Query("select u from com.example.jpa.domain.User u where u.id=?1") User findUserHobby(Long id);
-
测试
@Test public void testFindUserHobby(){ Assert.assertEquals(2,userRepository.findUserHobby(1L).getHobbies().size()); }