Динамический запрос JPA 2.0 с использованием Criteria API
-
22-09-2019 - |
Вопрос
Я немного застрял в построении динамического запроса с использованием CriteriaBuilder JPA 2.0.
Я думаю, у меня довольно распространенный вариант использования:Пользователь предоставляет произвольное количество параметров поиска X для их и/или объединения:нравиться :
select e from Foo where (name = X1 or name = X2 .. or name = Xn )
Метод или CriteriaBuilder не является динамическим:
Предикат или(Предикат...ограничения)
Идеи?Образцы?
Решение
В вашем случае я бы предпочел использовать Expression#in(Collection)
чтобы избежать необходимости зацикливаться и строить соединение Predicate
динамически:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Foo> cq = cb.createQuery(Foo.class);
Metamodel m = em.getMetamodel();
EntityType<Foo> Foo_ = m.entity(Foo.class);
Root<Foo> foo = cq.from(Foo_);
cq.where(my.get(Foo_.name).in(params));
Возможно, вы захотите проверить Базовые типобезопасные запросы с использованием Criteria API и Metamodel API Больше подробностей.
Другие советы
в этом коде Foo_.name выдаст ошибку компиляции.Поскольку поле в том не объявлено.Я не могу этого понять.Пожалуйста, предложите мне.
-рагу