В настоящее время я использую пружинные данные JPA с критериями API. Я создал собственный репозиторий для сущности. Предикаты создаются следующим образом: 2 примера:
public static <E> Predicate matchingCountryOrGroup(CountryCode country, List<String> euGroups,
SingularAttribute<E, String> countryAttribute,
SetAttribute<E, String> countryGroupAttribute, Root<E> deliveryMode,
CriteriaBuilder cb) {
String countryGroup = country.getCountryGroup();
Predicate countryGroupMatchPredicate = matchCountryGroup(countryGroup, euGroups, countryGroupAttribute, cb, deliveryMode);
Predicate countryMatchPredicate = caseInsensitiveStringMatch(country.getCountryId(), countryAttribute, cb,
deliveryMode);
Predicate countryPredicate = cb.or(countryGroupMatchPredicate, countryMatchPredicate);
Predicate bothNull = cb.and(cb.isNull(deliveryMode.get(countryAttribute)),
cb.isEmpty(deliveryMode.get(countryGroupAttribute)));
return cb.or(countryPredicate, bothNull);
}
public static <E> Predicate caseInsensitiveStringMatch(String match,
SingularAttribute<E, String> stringAttribute, CriteriaBuilder cb,
Root<E> deliveryMode) {
return cb.equal(cb.lower(deliveryMode.get(stringAttribute)), match.toLowerCase());
}
Я использую эти предикаты в нескольких запросах для разных атрибутов, таким образом, параметр для атрибута и разных сущностей. Что действительно раздражает, так это тот факт, что мне всегда нужно помещать в CriteriaBuilder и Root.
С другой стороны, я увидел API спецификации Spring, который, похоже, решает именно эту проблему, введя правильный root и CriteriaBuilder.
Вопрос: как я могу использовать / использовать этот API спецификации с моими видами предикатов - generi c для разных сущностей и generic c для разных атрибутов?
Обновлены вопрос и код для большей ясности