使用Predicate进行多条件查询包含and 、like、关键字搜索等方法

 Specification<DangerInfoPO> spec = new Specification<DangerInfoPO>() {
            @Override
            public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder cb) {
                List<Predicate> list = getAndPredicateList(cb,criteriaQuery,root,dto);

                if(null != dto.getDistrictCode() && dto.getDistrictCode().length > 0) {
                    list.add(cb.and(root.get("districtCode").in(dto.getDistrictCode())));
                }
                Predicate[] p = new Predicate[list.size()];


                criteriaQuery.where(cb.and(list.toArray(p)));

                return criteriaQuery.getRestriction();
            }

        };



private List<Predicate> getAndPredicateList(CriteriaBuilder criteriaBuilder, CriteriaQuery query,Root root,
                                                DangerInfoSearchDTO dto) {
        // 多条件And 查询
        List<Predicate> predicateList = new ArrayList<>();

        if (ArrayUtils.isNotEmpty(dto.getOrgcode())) {
            predicateList.add(root.get(DangerInfoConstants.FIELD_ORG_CODE).in(Arrays.asList(dto.getOrgcode())));
        }

        //多like模糊查询类似于select * from user where name like '%四%' or name like '%五%'

        if (ArrayUtils.isNotEmpty(dto.getDangerTypeCode())) {
            String[] dangerTypeCode = dto.getDangerTypeCode();
            int length = dangerTypeCode.length;
            if (length>0){
                List predicateList1 = new ArrayList();
                Predicate [] p = new Predicate[length];
                for (int i = 0; i <length ; i++) {
                    predicateList1.add(criteriaBuilder.like(root.get(DangerInfoConstants.FIELD_DANGERTYPE_CODE),pattern(dangerTypeCode[i])));
                }
                predicateList1.toArray(p);
                predicateList.add(criteriaBuilder.or(p));
            }

        }

        if (null != dto.getStartTime() && null != dto.getEndTime()) {
            predicateList.add(criteriaBuilder.greaterThanOrEqualTo(root.get(DangerInfoConstants.FIELD_UPDATE_TIME),
                    dto.getStartTime()));
            predicateList.add(criteriaBuilder.lessThanOrEqualTo(root.get(DangerInfoConstants.FIELD_UPDATE_TIME),
                    dto.getEndTime()));
        }
        //加上关键词搜索
        if(StringUtils.isNotBlank(dto.getKeywords())){
            predicateList.add(criteriaBuilder.or(criteriaBuilder.like(root.get(DangerInfoConstants.FIELD_DANGER_NAME),
                    pattern(dto.getKeywords()),ESCAPE),criteriaBuilder.like(root.get(DangerInfoConstants.FIELD_DANGER_ADDRESS),
                    pattern(dto.getKeywords()), ESCAPE)));
        }

        if (ArrayUtils.isNotEmpty(dto.getEngrossArea())) {
            Subquery<DangerInfoPO> areaSq = query.subquery(DangerInfoPO.class);
            Root<DangerInfoPO> aRoot = areaSq.from(DangerInfoPO.class);
            List<Predicate> areaSubList = new ArrayList<>();
            for (BigDecimal[] areaArr : dto.getEngrossArea()) {
                if (ArrayUtils.isNotEmpty(areaArr) && areaArr.length > 1) {
                    if (areaArr[0] != null && areaArr[1] == null) {
                        areaSubList.add(criteriaBuilder.greaterThanOrEqualTo(
                                root.get(DangerInfoConstants.FIELD_ENGROSSAREA), areaArr[0]));
                    } else if (areaArr[0] == null && areaArr[1] != null) {
                        areaSubList.add(criteriaBuilder.lessThanOrEqualTo(
                                root.get(DangerInfoConstants.FIELD_ENGROSSAREA), areaArr[1]));
                    } else {
                        areaSubList.add(criteriaBuilder.between(root.get(DangerInfoConstants.FIELD_ENGROSSAREA),
                                areaArr[0], areaArr[1]));
                    }
                }
            }

            Predicate areaSubPredicate = criteriaBuilder.or(areaSubList.toArray(new Predicate[areaSubList.size()]));
            areaSq.select(aRoot.<DangerInfoPO>get(DangerInfoConstants.FIELD_DANGER_ID)).where(areaSubPredicate);
            predicateList.add(root.get(DangerInfoConstants.FIELD_DANGER_ID).in(areaSq));
        }

        if (ArrayUtils.isNotEmpty(dto.getMaxPersonNum())) {
            Subquery<DangerInfoPO> numSq = query.subquery(DangerInfoPO.class);
            Root<DangerInfoPO> nRoot = numSq.from(DangerInfoPO.class);
            List<Predicate> numSubList = new ArrayList<>();
            for (Integer[] maxPerson : dto.getMaxPersonNum()) {
                if (ArrayUtils.isNotEmpty(maxPerson) && maxPerson.length > 1) {
                    if (maxPerson[0] != null && maxPerson[1] == null) {
                        numSubList.add(criteriaBuilder.greaterThanOrEqualTo(
                                root.get(DangerInfoConstants.FIELD_MAXPERSONNUM), maxPerson[0]));
                    } else if (maxPerson[0] == null && maxPerson[1] != null) {
                        numSubList.add(criteriaBuilder.lessThanOrEqualTo(
                                root.get(DangerInfoConstants.FIELD_MAXPERSONNUM), maxPerson[1]));
                    } else {
                        numSubList.add(criteriaBuilder.between(root.get(DangerInfoConstants.FIELD_MAXPERSONNUM),
                                maxPerson[0], maxPerson[1]));
                    }
                }
            }
            Predicate areaSubPredicate = criteriaBuilder.or(numSubList.toArray(new Predicate[numSubList.size()]));
            numSq.select(nRoot.<DangerInfoPO>get(DangerInfoConstants.FIELD_DANGER_ID)).where(areaSubPredicate);
            predicateList.add(root.get(DangerInfoConstants.FIELD_DANGER_ID).in(numSq));
        }
        return predicateList;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值