我有2个下拉列表和1个文本框,我想在其上使用datatable api中的sprcification类过滤数据表记录。我要在所有下拉列表或文本框之间的同一下拉列表中加上AND条件,但如果没有选择任何下拉值,则由于AND条件,我将返回null / empty结果。如果没有选择,我想将该下拉列表排除在AND条件之外。
我已经尝试了其他条件,但是如果我有更多的下拉菜单,它将增加我实际上不想要的排列和组合的数量。我想要简明扼要,性能有效的东西。我找到了criteriaQuery的解决方案,但我需要谓词的返回类型。
class FilterByMultipleObjectsForIncidentProposal<T> implements Specification<T>
{
private static final long serialVersionUID = 1L;
private final IncidentReportFilters customFilter;
public FilterByMultipleObjectsForIncidentProposal(IncidentReportFilters customFilter) {
this.customFilter = customFilter;
}
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> businessHierarchyPredicates = new ArrayList<>();
List<Predicate> userPredicates = new ArrayList<>();
List<Predicate> typeOfPredicates = new ArrayList<>();
if (this.customFilter.getBusinessHierarchy() != null) {
for (BusinessHierarchy filterobj : this.customFilter.getBusinessHierarchy()) {
businessHierarchyPredicates.add(criteriaBuilder.equal(root.get("incidentDept"), filterobj));
}
}
if (this.customFilter.getUsers() != null) {
for (Users filteruser : this.customFilter.getUsers()) {
userPredicates.add(criteriaBuilder.equal(root.get("reportedBy"), filteruser));
}
}
if (this.customFilter.getTypeOf() != null) {
typeOfPredicates.add(criteriaBuilder.equal(root.get("typeof"), this.customFilter.getTypeOf()));
}
if (businessHierarchyPredicates.size() > 0 && userPredicates.size() > 0 && typeOfPredicates.size() > 0) {
Predicate predicate1 = criteriaBuilder
.or(businessHierarchyPredicates.toArray(new Predicate[businessHierarchyPredicates.size()]));
Predicate predicate2 = criteriaBuilder.or(userPredicates.toArray(new Predicate[userPredicates.size()]));
Predicate predicate3 = criteriaBuilder.or(typeOfPredicates.toArray(new Predicate[typeOfPredicates.size()]));
return criteriaBuilder.and(predicate1, predicate2, predicate3);
} else if (businessHierarchyPredicates.size() > 0 && userPredicates.size() > 0) {
Predicate predicate1 = criteriaBuilder
.or(businessHierarchyPredicates.toArray(new Predicate[businessHierarchyPredicates.size()]));
Predicate predicate2 = criteriaBuilder.or(userPredicates.toArray(new Predicate[userPredicates.size()]));
return criteriaBuilder.and(predicate1, predicate2);
} else if (businessHierarchyPredicates.size() > 0 && typeOfPredicates.size() > 0) {
Predicate predicate1 = criteriaBuilder
.or(businessHierarchyPredicates.toArray(new Predicate[businessHierarchyPredicates.size()]));
Predicate predicate3 = criteriaBuilder.or(typeOfPredicates.toArray(new Predicate[typeOfPredicates.size()]));
return criteriaBuilder.and(predicate1, predicate3);
} else if (userPredicates.size() > 0 && typeOfPredicates.size() > 0) {
Predicate predicate2 = criteriaBuilder.or(userPredicates.toArray(new Predicate[userPredicates.size()]));
Predicate predicate3 = criteriaBuilder.or(typeOfPredicates.toArray(new Predicate[typeOfPredicates.size()]));
return criteriaBuilder.and(predicate2, predicate3);
} else if (userPredicates.size() > 0) {
Predicate predicate2 = criteriaBuilder.or(userPredicates.toArray(new Predicate[userPredicates.size()]));
return criteriaBuilder.and(predicate2);
} else if (typeOfPredicates.size() > 0) {
Predicate predicate3 = criteriaBuilder.or(typeOfPredicates.toArray(new Predicate[typeOfPredicates.size()]));
return criteriaBuilder.and(predicate3);
} else if (businessHierarchyPredicates.size() > 0) {
Predicate predicate1 = criteriaBuilder
.or(businessHierarchyPredicates.toArray(new Predicate[businessHierarchyPredicates.size()]));
return criteriaBuilder.and(predicate1);
} else {
return criteriaBuilder.conjunction();
}
}
}
输出正确,但性能不高。如果我选择部门“ Fianance”和用户“ Adil”,则应该给我记录有在金融部门工作的雇主阿迪尔的记录。但是,如果我只选择“ adil”,那么它应该只返回所有具有adil名称的员工,但是由于下拉菜单之间的AND条件而返回空值。这就是为什么我包含if if else条件,而我想用高效的代码代替的原因。