如何使用条件构建器和谓词排除条件中是否包含AND / OR谓词

时间:2019-06-17 08:02:49

标签: java spring-boot jpa datatables

我有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条件,而我想用高效的代码代替的原因。

0 个答案:

没有答案