处理jpa 复杂条件过滤筛选情况
private Specification<BatchSqlTask> getSpecification(BatchSqlTaskDTO batchSqlTask) {
return (root, query, builder) -> {
List<Predicate> list = new ArrayList<>();
list.add(builder.equal(root.get(BatchSqlTaskDTO.Fields.createdBy), batchSqlTask.getCreatedBy()));
List<Predicate> statusPredicates = new ArrayList<>();
if (!CollectionUtils.isEmpty(batchSqlTask.getStatusList())) {
for (String status : batchSqlTask.getStatusList()) {
statusPredicates.add(builder.equal(root.get(BatchSqlTaskDTO.Fields.status), status));
}
}
if (batchSqlTask.getPeriod() != null) {
String dateTime = DateUtil.formatDateTime(DateUtil.offsetDay(new Date(), batchSqlTask.getPeriod()));
list.add(builder.greaterThan(root.get(BatchSqlTaskDTO.Fields.createdAt), dateTime));
}
if (StringUtils.isNotBlank(batchSqlTask.getStartAt()) && StringUtils.isNotBlank(batchSqlTask.getEndAt())) {
Predicate between = builder.between(root.get(BatchSqlTaskDTO.Fields.createdAt),
batchSqlTask.getStartAt(),
batchSqlTask.getEndAt());
list.add(between);
}
Predicate[] p = new Predicate[list.size()];
Predicate[] pp = new Predicate[statusPredicates.size()];
Predicate pOr = builder.or(statusPredicates.toArray(pp));
query.where(builder.and(list.toArray(p)), pOr);
if (!Strings.isNullOrEmpty(batchSqlTask.getSortField())) {
if ("desc".equalsIgnoreCase(batchSqlTask.getSortOrder())) {
query.orderBy(builder.desc(root.get(batchSqlTask.getSortField())));
} else {
query.orderBy(builder.asc(root.get(batchSqlTask.getSortField())));
}
}
return query.getRestriction();
};
}