Spring JPA 复杂条件查询

Spring data jpa中,如果是单条件查询,可以在Repository中轻松实现;如果遇到多条件查询,也可以用mapper方式进行实现。

在项目开发中,遇到一个问题就是查询时间是区间,并且查询两个表,但是两个表中不是通过一对多或多对多实现,而是一个id关联。在此情况下,以上两种查询就无法实现。


后来发现jpa提供的JpaSpecificationExecutor接口,只要简单的实现toPredicate方法,就可以做复杂查询。


该接口具体使用方法:

1、首先让仓库类继承JpaSpecificationExecutor接口


2、实现toPredicate方法,将查询条件写到该方法中

Spring JPA 复杂条件查询_第1张图片

如此就可以实现查询功能。


说明:1、查询单个表中的数据,criteriaBuilder类有equal、notEqual、like、between(该方法可以实现时间区间的查询)等方法,可以查看具体的criteriaBuilder。

2、按实体查询


3、多表查询,其中msg是查询实体中的实体变量,通过msg中title进行查询。


4、查询列表



目前以上是我自己使用过的方法,其实还有很多内容,足以满足复杂的查询功能。


如果需要排序,但是不分页,可使用如下方式:

  1. Specification spec = new Specification() {  
  2.     public Predicate toPredicate(Root root,  
  3.             CriteriaQuery query, CriteriaBuilder cb) {  
  4.         Predicate p1 = cb.like(root.get("name").as(String.class), "%"+um.getName()+"%");  
  5.         Predicate p2 = cb.equal(root.get("uuid").as(Integer.class), um.getUuid());  
  6.         Predicate p3 = cb.gt(root.get("age").as(Integer.class), um.getAge());  
  7.         //把Predicate应用到CriteriaQuery中去,因为还可以给CriteriaQuery添加其他的功能,比如排序、分组啥的  
  8.         query.where(cb.and(p3,cb.or(p1,p2)));  
  9.         //添加排序的功能  
  10.         query.orderBy(cb.desc(root.get("uuid").as(Integer.class)));  
  11.           
  12.         return query.getRestriction();  
  13.     }  
  14. };  


你可能感兴趣的:(Spring JPA 复杂条件查询)