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;
}
使用Predicate进行多条件查询包含and 、like、关键字搜索等方法
最新推荐文章于 2023-03-02 13:49:49 发布