spring data jpa(二)复杂查询

分页查询:

分页查询在实际使用中非常普遍了,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的形式来获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值