Springboot+jpa之 Specification复杂查询2:And查询和Or查询的组合以及In查询使用

and和or组合重点代码:

       List tempAnd = new ArrayList<>(); //临时查询条件and
       List tempOr = new ArrayList<>(); //临时查询条件or

        if (!StringUtils.isNullOrEmpty(user.getDeptId()) && user.getDeptId() != 0) {

                 //查询条件1:用户部门ID与查询的部门ID一致
                 tempOr.add(cb.equal(deptId, user.getDeptId()));

                 //查询条件2:用户名与查询用户名一致
                 tempOr.add(cb.equal(userName,user.getUserName));
         }

        //复杂查询:and和or的组合使用
        //1.定义一个Predicate数组
        Predicate[] array_and = new Predicate[tempAnd.size()]; 
       
        //2.将and查询的条件添加到数组中
        Predicate Pre_And = cb.and(tempAnd.toArray(array_and)); 
        
        //3.再定义一个数组
        Predicate[] arrayOr = new Predicate[tempOr.size()];
        
        //4.将or查询的条件添加到数组中
        Predicate Pre_Or = cb.or(tempOr.toArray(arrayOr)); 


        //构建组合查询条件
        query.where(Pre_And, Pre_Or);

        return query.getRestriction();

 

  • 注意,and的优先级高于or,并且or条件如果只有一个查询条件,只会构成and条件
  • 前提:有三个条件(a,b,c) select u.* from user u where
  • 使用and条件 where后面添加的条件为: a and b and c
  • 使用or条件,只有一个条件a ,where 后面条件的条件为 1=1 and a (1=1为不存在and查询条件时自动添加的)
  • 使用or条件,有两个条件a、b ,where 后面条件的条件为 1=1 and (a or b) 

In查询:需求查询用户deptId属于depts集合的数据

主要代码: 

                CriteriaBuilder.In in = cb.in(root.get("deptId").as(Long.class));
                List depts = deptDao.selectDeptAncestorsList(user.getDeptId());
                if (depts.size() > 0) {
                    depts.forEach(item -> in.value(item));
                    tempOr.add(cb.or(in)); 
 }

                CriteriaBuilder.In in = cb.in(root.get("deptId").as(Long.class));

                //查询祖级列表中包含当前部门ID的部门ID集合
                List depts = deptDao.selectDeptAncestorsList(user.getDeptId());


                if (depts.size() > 0) {
                    //查询部门祖级列表包含当前查询用户部门Id的用户
                    depts.forEach(item -> in.value(item));

                    //查询条件:查询祖级列表中包括当前查询部门Id的用户
                    tempOr.add(cb.or(in));
                }

 例子:And查询和Or查询的组合以及In查询使用

//查询定义
Specification specification = new Specification() {
    /**
     * 构造断言
     * @param root 实体对象引用
     * @param query 规则查询对象
     * @param cb 规则构建对象
     */
    @Override
    public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {

        List predicates = new ArrayList<>();

        List tempAnd = new ArrayList<>(); //临时查询条件and
        List tempOr = new ArrayList<>(); //临时查询条件or

        // 查询条件:1.用户姓名 2.用户电话 3.用户状态 4.创建时间范围
        // 如果查询条件都为null则分页查询全部
        if (StringUtils.isNullOrEmpty(user.getUserName())
                && StringUtils.isNullOrEmpty(user.getPhone())
                && StringUtils.isNullOrEmpty(user.getStatus())
                && StringUtils.isNullOrEmpty(user.getBeginTime())
                && StringUtils.isNullOrEmpty(user.getEndTime())
                && StringUtils.isNullOrEmpty(user.getDeptId())) {

            //没有查询条件的时候直接查询全部
            query.where(predicates.toArray(new Predicate[predicates.size()]));

            //添加排序的条件语句
            query.orderBy(cb.asc(root.get("createTime")));

            return query.getRestriction();
        } else {

            //引用实体对象属性
            Path userName = root.get("userName");
            Path phone = root.get("phone");
            Path status = root.get("status");
            Path createTime = root.get("createTime");
            Path deptId = root.get("deptId");

            //查询条件不为空或者null时
            if (!StringUtils.isNullOrEmpty(user.getUserName())) {
                //添加条件:用户名的模糊查询
                tempAnd.add(cb.like(userName, "%" + user.getUserName() + "%"));
            }
            if (!StringUtils.isNullOrEmpty(user.getPhone())) {
                //添加条件:手机号与查询手机号一致
                tempAnd.add(cb.equal(phone, user.getPhone()));
            }
            if (!StringUtils.isNullOrEmpty(user.getStatus())) {
                tempAnd.add(cb.equal(status, user.getStatus()));
            }

            if (!StringUtils.isNullOrEmpty(user.getBeginTime())
                    && !StringUtils.isNullOrEmpty(user.getEndTime())) {
                tempAnd.add(cb.between(createTime, DateUtils.parseDate(user.getBeginTime()), DateUtils.parseDate(user.getEndTime())));
            }

            if (!StringUtils.isNullOrEmpty(user.getDeptId()) && user.getDeptId() != 0) {

                CriteriaBuilder.In in = cb.in(root.get("deptId").as(Long.class));

                //查询祖级列表中包含当前部门ID的部门ID集合
                List depts = deptDao.selectDeptAncestorsList(user.getDeptId());

                //查询条件1:部门ID与查询的部门ID一致
                tempOr.add(cb.equal(deptId, user.getDeptId()));

                if (depts.size() > 0) {
                    //查询部门祖级列表包含当前查询用户部门Id的用户
                    depts.forEach(item -> in.value(item));

                    //查询条件2:查询祖级列表中包括当前查询部门Id的用户
                    tempOr.add(cb.or(in));
                }
            }

            //复杂查询:and和or的组合使用
            Predicate[] array_and = new Predicate[tempAnd.size()]; //1.定义一个Predicate数组
            Predicate Pre_And = cb.and(tempAnd.toArray(array_and)); //2.将and查询的条件添加到数组中

            Predicate[] arrayOr = new Predicate[tempOr.size()];//3.再定义一个数组
            Predicate Pre_Or = cb.or(tempOr.toArray(arrayOr)); //4.将or查询的条件添加到数组中

            //构建组合查询条件
            query.where(Pre_And, Pre_Or);

            //添加排序的功能
            query.orderBy(cb.asc(root.get("createTime")));

            return query.getRestriction();
        }
    }
};

//分页信息
Pageable pageable = PageRequest.of(pageDomain.getPageNum() - 1, pageDomain.getPageSize()); //页码:前端从1开始,jpa从0开始,做个转换

//查询
return userDao.findAll(specification, pageable);

 

你可能感兴趣的:(Springboot+jpa之 Specification复杂查询2:And查询和Or查询的组合以及In查询使用)