Вопрос

Я немного застрял в построении динамического запроса с использованием 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 выдаст ошибку компиляции.Поскольку поле в том не объявлено.Я не могу этого понять.Пожалуйста, предложите мне.

-рагу

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top