分页查询:
分页查询在实际使用中非常普遍了,spring data
jpa已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable,当查询中有多个参数的时候Pageable建议做为最后一个参数传入
Page<User> findALL(Pageable pageable);
Page<User> findByUserName(String userName,Pageable pageable);
Pageable是spring封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则
@Test
public void testPageQuery() throws Exception{
int page = 1,size = 10;
Sort sort = new Sort(Direction.DESC,"id");
Pageable pageable = new PageRequest(page,size,sort);
userRepository.findALL(pageable);
userRepository.findByUserName("testName",pageable);}
限制查询:
有时候我们只需要查询前N个元素,或者只取前一个实体。
User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
Page queryFirst10ByLastname(String lastname, Pageable pageable);
List findFirst10ByLastname(String lastname, Sort sort);
List findTop10ByLastname(String lastname, Pageable pageable);
自定义SQL查询:
其实Spring data 觉大部分的SQL都可以根据方法名定义的方式来实现,但是由于某些原因我们想使用自定义的SQL来查询,spring data也是完美支持的;在SQL的查询方法上面使用@Query注解,如涉及到删除和修改在需要加上@Modifying.也可以根据需要添加@Transactional对事务的支持,查询超时的设置等。@Transactional对事务的控制,一般加在service层
注:自定义sql结尾不能加分号,否则将使占位失效
@Modifying
@Query(“update User u set u.userName = ?1 where u.id = ?2”)
int modifyByIdAndUserId(String userName,Long id);
@Transactional
@Modifying
@Query(“delete from User where id = ?1”)
void deleteByUserId(Long id);
@Transactional(timeout=10)
@Query(“select u from User u where u.emailAddress = ?1”)
User findByEmailAddress(String emailAddress);
多表查询:
多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果,这里主要第二种方式。
首先需要定义一个结果集的接口类。
public interface HotelSummary{
City getCity();
String getName();
Double getAverageRating();
default Integer getAverageRatingRounded(){
return getAverageRating()==null?null:(int)Math.round(getAverageRating());
}
}
查询的方法返回类型设置为新创建的接口
@Query("select h.city as city, h.name as name, avg(r.rating) as averageRating "
+"from Hotel h left outer join h.reviews r where h.city = ?1 group by h")
Page findByCity(City city,Pageable pageable);
@Query(“select h.name as name, avg(r.rating) as averageRating from Hotel h left outer join h.reviews r group by h”)
Page findByCity(Pageable pageable);
使用
Page hotels = this.hotelRepository.findByCity(new PageRequest(0,10,Direction.ASC,“name”));
for(HotelSummary summay : hotels){
System.out.println("Name"+summay.getName());
}
在运行中Spring会给接口(HotelSummary)自动生产一个代理类来接收返回的结果,代码汇总使用getXX的形式来获取