Spring data jpa中,如果是单条件查询,可以在Repository中轻松实现;如果遇到多条件查询,也可以用mapper方式进行实现。
在项目开发中,遇到一个问题就是查询时间是区间,并且查询两个表,但是两个表中不是通过一对多或多对多实现,而是一个id关联。在此情况下,以上两种查询就无法实现。
后来发现jpa提供的JpaSpecificationExecutor接口,只要简单的实现toPredicate方法,就可以做复杂查询。
该接口具体使用方法:
1、首先让仓库类继承JpaSpecificationExecutor接口

2、实现toPredicate方法,将查询条件写到该方法中
![]() 
如此就可以实现查询功能。
说明:1、查询单个表中的数据,criteriaBuilder类有equal、notEqual、like、between(该方法可以实现时间区间的查询)等方法,可以查看具体的criteriaBuilder。
2、按实体查询
![]() 
3、多表查询,其中msg是查询实体中的实体变量,通过msg中title进行查询。
![]() 
4、查询列表
![]() 
目前以上是我自己使用过的方法,其实还有很多内容,足以满足复杂的查询功能。
如果需要排序,但是不分页,可使用如下方式:
-
Specification<UserModel> spec = new Specification<UserModel>() {
-
public Predicate toPredicate(Root<UserModel> root,
-
CriteriaQuery<?> query, CriteriaBuilder cb) {
-
Predicate p1 = cb.like(root.get("name").as(String.class), "%"+um.getName()+"%");
-
Predicate p2 = cb.equal(root.get("uuid").as(Integer.class), um.getUuid());
-
Predicate p3 = cb.gt(root.get("age").as(Integer.class), um.getAge());
-
-
query.where(cb.and(p3,cb.or(p1,p2)));
-
-
query.orderBy(cb.desc(root.get("uuid").as(Integer.class)));
-
-
return query.getRestriction();
-
}
-
};
|