spring data jpa(二)复杂查询

分页查询:

分页查询在实际使用中非常普遍了,spring data jpa已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable,当查询中有多个参数的时候Pageable建议做为最后一个参数传入

Page findALL(Pageable pageable);

Page 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的形式来获取

摘自: springboot(五):spring data jpa的使用 - 纯洁的微笑博客

你可能感兴趣的:(spring data jpa(二)复杂查询)