У меня есть 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 условия, которые я хочу заменить на эффективный код.