Я использую API-интерфейс JPA в приложении JPA для данных Spring. Мой класс сервиса использует статические методы для извлечения Specifications
, которые затем могут быть объединены вместе для формирования конкретного запроса. Например.Как правильно применить выбор подключения в JPA Критерии API
repository.findAll(where(matchById(str)).or(matchByName(str)))
Здесь я использую два метода, которые возвращают спецификации с соответствующими критериями, применяемыми к нему. Вот как выглядят оба метода:
public static Specification<SomeEntity> matchById(String str) {
return (root, criteriaQuery, cb) ->
cb.like(root.get(SomeEntity_.id).as(String.class), str + "%");
}
public static Specification<SomeEntity> matchByName(String str) {
return (root, criteriaQuery, cb) -> {
cb.or(cb.like(cb.lower(root.get(SomeEntity_.firstName)), str.toLowerCase() + "%"),
cb.like(cb.lower(root.get(SomeEntity_.lastName)), str.toLowerCase() + "%")
);
}
Это прекрасно работает. Я хочу, чтобы добавить
root.fetch(SomeEntity_.employee, JoinType.INNER);
таким образом, что все запросы, которые построены с использованием любой комбинации статических методов Спецификации, использовать FETCH JOIN
.
Если я добавлю это утверждение к статическим методам, тогда INNER JOIN применяется дважды, что не кажется правильным. В идеале, я думаю, у меня должен быть другой статический метод, который применяет только FETCH JOIN
и возвращает спецификации, но я не могу понять, как вернуть Predicate
без использования каких-либо методов criteriaBuilder
. Чтобы уточнить, так должен выглядеть мой метод:
public static Specification<SomeEntity> start() {
return (root, criteriaQuery, criteriaBuilder) -> {
root.fetch(SomeEntity_.employee, JoinType.INNER);
// NOW RETURN WHAT ???
return null;
};
}
Любая помощь будет оценена.