深入讲解SpringBoot+jpa实现多字段模糊查询

1. Jpa模糊查询学习笔记一:springBoot+jpa实现多条件模糊查询1.1. 扩展知识1.2. jpa多条件查询重写Specification的toPredicate方法1.3. toPredicate()方法的三个参数:Rootroot,  CriteriaQuery criteriaQuery  ,   CriteriaBuilder criteriaBuilder1.4. Criteria查询对象的构建1.5. 多条件查询案例1.6. 源码1.7. 参考文档

1. Jpa模糊查询学习笔记一:springBoot+jpa实现多条件模糊查询

1.1. 扩展知识

  1. 匿名内部类:https://blog.csdn.net/HackerSaillen/article/details/47281549
  2. 匿名内部类:https://blog.csdn.net/hellocsz/article/details/81974251
  3. Predicate方法:https://www.cnblogs.com/sandea/p/7803731.html
  4. list.toArray(p):https://blog.csdn.net/YimBa/article/details/78550454

1.2. jpa多条件查询重写Specification的toPredicate方法

  1. jpa的Criteria查询的相应接口是JpaSpecificationExecutor,==也就是说如果dao层要使用jpa的查询功能,就要先继承该接口==
  2. Criteria查询:是一种类型安全并且面向对象的一种查询功能。JpaSpecificationExecutor接口基本围绕着Specification接口来定义的,Specification接口只定义了一个方法。即:toPredicate()方法。
1public Predicate toPredicate(Root<DevWarnPo> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) 
2

1.3. toPredicate()方法的三个参数:Root <T>  root,  CriteriaQuery criteriaQuery  ,   CriteriaBuilder criteriaBuilder

  1. CriteriaQuery criteriaQuery :这是一个面向对象查询,代表的是Specific的顶层查询对象,它包含查询的各个部分:select,from,where,group by, order by等,不过它是一个面向对象的查询方式,只对实体类型,嵌入式类型的Criteria查询起作用。
  2. Root<T>  root :代表要查询的对象,也就是实体类型,实体类型好比sql语句中的from后的表。传入实体类型后,会被CriteriaQuery的父类AbstractQuery.from将实体类型传入。
  3. CriterBuilder  criteriaBuilder:用来构建CriteriaQuery的构建器对象Predicate(谓语),即:一个简单或者复杂的谓语类型,相当于条件或者多条件集合。
  4. Predicate:就是多条件查询中的条件,可以通过List<Predicate> 实现多个条件操作。

1.4. Criteria查询对象的构建

  1. 通过EntityManager的getCriteriaBuilder或EntityManagerFactory的getCriteriaBuilder方法可以得到CriteriaBuilder对象。
  2. 通过调用CriteriaBuilder的createQuery或createTupleQuery方法可以获得CriteriaQuery的实例。
  3. 上面这两个是对三个参数的赋值操作。
  4. 除此之外还要对Predicate这个多条件内容进行赋值,是通过第三个参数CriteriaBuilder实现的。
  • 过滤条件会被应用到SQL语句的FROM子句中。在criteria 查询中,查询条件通过Predicate或Expression实例应用到CriteriaQuery对象上。
  • 这些条件使用 CriteriaQuery .where 方法应用到CriteriaQuery 对象上
  • CriteriaBuilder也作为Predicate实例的工厂,通过调用CriteriaBuilder 的条件方( equalnotEqual, gt, ge,lt, le,between,like等)创建Predicate对象。
  • 复合的Predicate 语句可以使用CriteriaBuilder的and, or andnot 方法构建。

1.5. 多条件查询案例

  1. 调用dao层,并创建查询方法,还要有分页机制。
  • new Specification<DevWarnPo> 这是一个接口,相当于匿名内部类,实现了改接口的方法。toPredicate();
  • dao层一定要继承JpaSpecificationExecutor接口。
  • 注意尖括号里的类型。
1Page<DevWarnPo> devWarnPoPage = devWarnDao.findAll(new Specification<DevWarnPo>() {
  1. 重写Specification方法,只有一个toPredicate()
  • Root是查询对象,CriteriaQuery()是生成查询语句。CriteriaBuilder是进行给多条件赋值和设置like等条件的对象引用。
1public Predicate toPredicate(Root<DevWarnPo> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
  1. 设置多条件
  • 设置where是CriteriaQuery对象的事,设置条件是CriteriaBuilder的事。
1if(org.apache.commons.lang.StringUtils.isNotEmpty(devWarnModel.getDevWarnType())){
2    list.add(criteriaBuilder.like(root.get("devWarnType").as(String.class), "%"+ devWarnModel.getDevWarnType().trim().replaceAll("/","//").replaceAll("_","/_").replaceAll("%","/%")+"%",'/'));
3}
  1. 添加到CriteriaBuilder中,进行返回条件Predicate
1Predicate[] p = new Predicate[list.size()];
2return criteriaBuilder.and(list.toArray(p));

1.6. 源码

 1@Override
 2public Result findAllDevWarn(DevWarnModel devWarnModel) {
 3    Pageable pageable = PageRequest.of(devWarnModel.getPageIndex(), devWarnModel.getPageSize());
 4    Page<DevWarnPo> devWarnPoPage = devWarnDao.findAll(new Specification<DevWarnPo>() {
 5        @Override
 6        public Predicate toPredicate(Root<DevWarnPo> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
 7            List<Predicate> list = new ArrayList<Predicate>();
 8            if(org.apache.commons.lang.StringUtils.isNotEmpty(devWarnModel.getDevWarnType())){
 9                list.add(criteriaBuilder.like(root.get("devWarnType").as(String.class), "%"+ devWarnModel.getDevWarnType().trim().replaceAll("/","//").replaceAll("_","/_").replaceAll("%","/%")+"%",'/'));
10            }
11            Predicate[] p = new Predicate[list.size()];
12            return criteriaBuilder.and(list.toArray(p));
13        }
14    },pageable);
15    return Result.success(devWarnPoPage);
16}

1.7. 参考文档

  1. https://blog.csdn.net/YimBa/article/details/78550454
  2. https://blog.csdn.net/ID_Kong/article/details/70225032
  3. https://www.cnblogs.com/g-smile/p/9177841.html
  4. https://www.cnblogs.com/sandea/p/7803731.html

未经允许不得转载:大自然的搬运工 » 深入讲解SpringBoot+jpa实现多字段模糊查询

赞 (1)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址