[JPA复习 ] Specification多条件查询

Myth丶恋晨 2023-10-04 11:31 205阅读 0赞

下面的文字結合代码阅读:

  1. CriteriaBuilder 安全查询创建工厂
  2. CriteriaBuilder 安全查询创建工厂,,创建CriteriaQuery,创建查询具体具体条件Predicate 等。
    CriteriaBuilder是一个工厂对象,安全查询的开始.用于构建JPA安全查询.可以从EntityManager 或
    EntityManagerFactory类中获得CriteriaBuilder。

CriteriaQuery 安全查询 语句

  1. 它通过调用 CriteriaBuilder, createQuery 或CriteriaBuilder.createTupleQuery
    获得。 CriteriaBuilder就像CriteriaQuery 的工厂一样。
    CriteriaQuery对象必须在实体类型或嵌入式类型上的Criteria 查询上起作用。

    在CriteriaBuilder底层 发现有 CriteriaQuery方法;
    CriteriaBuilder 安全查询创建工厂,,创建CriteriaQuery,
    在这里插入图片描述

Predicate 讲解条件:

  1. 过滤条件应用到SQL语句的FROM子句中。

    在criteria 查询中,查询条件通过Predicate 或Expression 实例应用到CriteriaQuery 对象上。

    这些条件使用 CriteriaQuery .where 方法应用到CriteriaQuery 对象上。

    Predicate 实例也可以用Expression 实例的 isNull, isNotNull 和
    in方法获得,复合的Predicate 语句可以使用CriteriaBuilder的and, or andnot 方法构建。

    CriteriaBuilder 也是作为Predicate 实例的工厂,Predicate 对象通过调用CriteriaBuilder
    的条件方法( equal,notEqual, gt, ge,lt, le,between,like等)创建。

    这些条件使用 CriteriaQuery.where 方法应用到CriteriaQuery对象上。

Root 讲解含义:
Root 定义查询的From子句中能出现的类型

criteriaQuery查询的查询根定义了实体类型,能为将来导航获得想要的结果,它与SQL查询中的FROM子句类似。

Root实例也是类型化的,且定义了查询的FROM子句中能够出现的类型。
查询根实例能通过传入一个实体类型给 AbstractQuery.from方法获得。
CriteriaQuery继承AbstractQuery里的方法
CriteriaQuery底层:
CriteriaQuery继承 AbstractQuery

在这里插入图片描述
AbstractQuery底层:
CriteriaQuery和它一样 都是对
在这里插入图片描述
CommonAbstractCriteria底层:

在这里插入图片描述

在这里插入图片描述

criteriaQuery查询,可以有多个查询根。
Employee实体的查询根对象可以用以下的语法获得 :
Root cardManagement= criteriaQuery.from(CardManagement.class); 这里的


  1. Root:查询哪个表 CriteriaQuery:查询哪些字段,排序是什么
    CriteriaBuilder:字段之间是什么关系,如何生成一个查询条件,每一个查询条件都是什么方式
    Predicate(Expression):单独每一条查询条件的详细描述,和CriteriaBuilder接口的各个查询条件拼接

如以下代码:

  1. /**
  2. * 动态多条件查询 :这里是根据卡管理表的 客户姓名和身份证模糊 查询
  3. * @param name
  4. * @param peopleId
  5. * @return
  6. */
  7. @Override
  8. public Long findByNameAndPid(String name, String peopleId) {
  9. System.out.println("打印入參信息"+name+"==="+peopleId);
  10. Long resultList = null;
  11. Specification querySpecifi = new Specification<CardManagement>() {
  12. @Override
  13. public Predicate toPredicate(Root<CardManagement> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
  14. List<Predicate> predicates = new ArrayList<>();
  15. if(null != name){
  16. predicates.add(criteriaBuilder.like(root.get("name"), "%"+name+"%"));
  17. }
  18. if(null != peopleId){
  19. predicates.add(criteriaBuilder.like(root.get("peopleId"), "%"+peopleId+"%"));
  20. }
  21. return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
  22. }
  23. };
  24. resultList = this.cardManagementRepository.count(querySpecifi);
  25. System.out.println("打印輸出信息"+resultList);
  26. return resultList;
  27. }

1:root 先封装的对应 对象,
2:root 对象名称.get 获取到对应对象里的属性值;
3:criteriaBuilder.like 模糊查询,字段通过这个方法被predicates.add 以数组的形式保存
4:criteriaBuilder.and 拼接 predicates 里存储的多个 多条件查询
select * from 表名 where 条件=? and 条件=?

在这里插入图片描述


  1. @RequestMapping(value = "/findByCondition",method = RequestMethod.POST)
  2. @ApiOperation("查询")
  3. public Optional<CardManagement> findByCondition(String name){
  4. System.out.println("55"+name);
  5. Optional<CardManagement> resultList = null;
  6. Specification querySpecifi = new Specification<CardManagement>() {
  7. @Override
  8. public Predicate toPredicate(Root<CardManagement> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
  9. List<Predicate> predicates = new ArrayList<>();
  10. // if(null != name){
  11. // predicates.add(criteriaBuilder.greaterThan(root.get("name"), name));
  12. // }
  13. // if(null != maxDate){
  14. // predicates.add(criteriaBuilder.lessThan(root.get("subscribeTime"), maxDate));
  15. // }
  16. if(null != name){
  17. predicates.add(criteriaBuilder.like(root.get("name"), "%"+name+"%"));
  18. }
  19. return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
  20. }
  21. };
  22. resultList = this.cardManagementRepository.findOne(querySpecifi);
  23. return resultList;
  24. }

发表评论

表情:
评论列表 (有 0 条评论,205人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jpa specification条件查询

    1. 1. [spring][] data jpa 通过创建方法名来做查询,只能做简单的查询,那如果我们要做复杂一些的查询呢,多条件分页怎么办,这里,spring data