Как исключить предикат AND / OR для включения в условие без условия if используя построитель критериев и предикаты - PullRequest
1 голос
/ 17 июня 2019

У меня есть 2 выпадающих списка и 1 текстовое поле, в котором я хочу отфильтровать записи данных с помощью класса sprcification в API данных. Я хочу или условие в том же выпадающем меню плюс условие AND между всеми выпадающими списками или текстовым полем, но если какое-либо раскрывающееся значение, которое я не выбираю, возвращает нулевой / пустой результат из-за условия AND. Я хочу исключить этот раскрывающийся список для исключения из условия AND, если оно не выбрано.

Я пробовал это с другими условиями, но если у меня будет больше выпадающих меню, это увеличит количество перестановок и комбинаций, которые я на самом деле не хочу. Я хочу что-то краткое и эффективное исполнение. Я нашел решение с критериями Query, но мне нужен тип возвращаемого предиката.

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», он должен вернуть только всех сотрудников с именем adil, но он возвращался пустым из-за условия AND между выпадающими списками. Вот почему я включил if else условия, которые я хочу заменить на эффективный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...