Я работаю над компонентом динамического фильтра на основе QueryDSL с использованием SpringData для выполнения запроса. Таким образом, я создаю Predicate
экземпляров из полученного объявления данных, передавая его QueryDslPredicateExecutor
. Для динамического доступа к атрибутам сущности я использую общий PathBuilder
, введенный в класс сущности.Коллекция фильтров по нескольким атрибутам его элементов - QueryDSL
Рассмотрим следующий (упрощенный) код:
class Offer {
List<LanguageToName> names;
}
class LanguageToName {
String name;
String language;
}
При попытке запросить Offer
entites, которые имеют в своей коллекции name
элемента с атрибутом «ABC», я просто создать предикат следующим образом:
pathBuilder.getCollection("names", LanguageToName.class).any().getString("name")
.like("%" + fieldData.getFieldValue() + "%");
Однако мне не удалось найти решение для фильтрации коллекции по нескольким атрибутам содержащихся объектов с использованием PathBuilder
. Когда я добавляю код выше с .and()
и снова получаю доступ к коллекции через переменную pathBuilder
, я, естественно, получаю результат, эквивалентный добавлению SQL-запроса с AND EXISTS...
, что не является желаемым результатом. Я также пытался использовать getCollection().contains()
, но мне не удалось создать Expression<LanguageToName>
, который описывал бы такой случай.
Есть ли способ создать Predicate
, который будет фильтровать объекты по нескольким атрибутам элементов из коллекции, то есть поле запрашиваемого объекта?