Spring JPA 复杂条件查询

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 12:22   11   0

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、查询列表



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


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

  1. Specification<UserModel> spec = new Specification<UserModel>() {
  2. public Predicate toPredicate(Root<UserModel> 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. return query.getRestriction();
  12. }
  13. };


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP