Java 如何使用条件生成器和谓词排除条件中要包含的和/或谓词,而不使用if-else条件

Java 如何使用条件生成器和谓词排除条件中要包含的和/或谓词,而不使用if-else条件,java,spring-boot,jpa,datatables,Java,Spring Boot,Jpa,Datatables,我有两个下拉列表和一个文本框,我想在上面用DataTableAPI中的指定类过滤datatable记录。我希望或条件位于同一下拉列表中,加上所有下拉列表或文本框之间的AND条件,但如果我没有选择任何下拉列表值,则由于AND条件返回null/空结果。如果未选择该下拉列表,我希望将其从和条件中排除 我已经尝试了if-else条件,但是如果我有更多的下拉列表,它将增加我实际上不想要的排列和组合的数量。我想要简洁高效的东西。我找到了criteriaQuery的解决方案,但我需要谓词的返回类型 class

我有两个下拉列表和一个文本框,我想在上面用DataTableAPI中的指定类过滤datatable记录。我希望或条件位于同一下拉列表中,加上所有下拉列表或文本框之间的AND条件,但如果我没有选择任何下拉列表值,则由于AND条件返回null/空结果。如果未选择该下拉列表,我希望将其从和条件中排除

我已经尝试了if-else条件,但是如果我有更多的下拉列表,它将增加我实际上不想要的排列和组合的数量。我想要简洁高效的东西。我找到了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();
        }

    }

}
class FilterByMultipleObjectsForIncidentProposal实现规范
{
私有静态最终长serialVersionUID=1L;
私人最终事故报告过滤器customFilter;
公共过滤器YMultipleObjectsForIncident提案(IncidentReportFilters customFilter){
this.customFilter=customFilter;
}
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder CriteriaBuilder){
List businessHierarchyPredicates=new ArrayList();
List userPredicates=new ArrayList();
List typeOfPredicates=new ArrayList();
if(this.customFilter.getBusinessHierarchy()!=null){
对于(BusinessHierarchy filterobj:this.customFilter.getBusinessHierarchy()){
add(criteriaBuilder.equal(root.get(“incidentDept”),filterobj));
}
}
if(this.customFilter.getUsers()!=null){
对于(用户筛选器用户:this.customFilter.getUsers()){
add(criteriaBuilder.equal(root.get(“reportedBy”),filteruser));
}
}
if(this.customFilter.getTypeOf()!=null){
add(criteriaBuilder.equal(root.get(“typeof”),this.customFilter.getTypeOf());
}
if(businessHierarchyPredicates.size()>0&&userPredicates.size()>0&&typeOfPredicates.size()>0){
谓词谓词1=criteriaBuilder
.or(businessHierarchyPredicates.toArray(新谓词[businessHierarchyPredicates.size()]);
谓词谓词2=criteriaBuilder.or(userPredicates.toArray(新谓词[userPredicates.size()]);
谓词谓词3=criteriaBuilder.or(typeOfPredicates.toArray(新谓词[typeOfPredicates.size());
返回criteriaBuilder.and(谓词1、谓词2、谓词3);
}else if(businessHierarchyPredicates.size()>0&&userPredicates.size()>0){
谓词谓词1=criteriaBuilder
.or(businessHierarchyPredicates.toArray(新谓词[businessHierarchyPredicates.size()]);
谓词谓词2=criteriaBuilder.or(userPredicates.toArray(新谓词[userPredicates.size()]);
返回criteriaBuilder.and(谓词1,谓词2);
}else if(businessHierarchyPredicates.size()>0&&typeOfPredicates.size()>0){
谓词谓词1=criteriaBuilder
.or(businessHierarchyPredicates.toArray(新谓词[businessHierarchyPredicates.size()]);
谓词谓词3=criteriaBuilder.or(typeOfPredicates.toArray(新谓词[typeOfPredicates.size());
返回criteriaBuilder.and(谓词1、谓词3);
}else if(userPredicates.size()>0&&typeOfPredicates.size()>0){
谓词谓词2=criteriaBuilder.or(userPredicates.toArray(新谓词[userPredicates.size()]);
谓词谓词3=criteriaBuilder.or(typeOfPredicates.toArray(新谓词[typeOfPredicates.size());
返回criteriaBuilder.and(谓词2、谓词3);
}else if(userPredicates.size()>0){
谓词谓词2=criteriaBuilder.or(userPredicates.toArray(新谓词[userPredicates.size()]);
返回criteriaBuilder.and(谓词2);
}else if(typeOfPredicates.size()>0){
谓词谓词3=criteriaBuilder.or(typeOfPredicates.toArray(新谓词[typeOfPredicates.size());
返回criteriaBuilder.and(谓词3);
}else if(businessHierarchyPredicates.size()>0){
谓词谓词1=criteriaBuilder
.or(businessHierarchyPredicates.toArray(新谓词[businessHierarchyPredicates.size()]);
返回criteriaBuilder.and(谓词1);
}否则{
返回criteriaBuilder.conjunction();
}
}
}
输出是正确的,但性能不高。如果我选择部门“财务”和用户“Adil”,则应提供Adil作为在财务部门工作的雇主的记录,但如果我只选择“Adil”它应该只返回名为adil的所有员工,但由于下拉列表之间的条件和,它返回为空。这就是为什么我要使用有效代码替换包含if-else条件的原因