Динамический запрос JPA 2.0 с использованием Criteria API - PullRequest
9 голосов
/ 24 марта 2010

Я немного застрял при создании динамического запроса с использованием CriteriaBuilder из JPA 2.0.

У меня довольно распространенный случай использования: пользователь предоставляет произвольное количество параметров поиска X для объединения и / или объединения: например:

select e from Foo where (name = X1 or name = X2 .. or name = Xn )

Метод или CriteriaBuilder не является динамическим:

Предикат или (Предикат ... ограничения)

Идеи? Образцы?

Ответы [ 2 ]

7 голосов
/ 25 марта 2010

В вашем случае я бы предпочел использовать 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));

Возможно, вы захотите проверить Базовые безопасные запросы типа Использование API критериев и API метамодели для получения более подробной информации.

1 голос
/ 03 августа 2010

в этом коде Foo_.name будет давать ошибку компиляции. Поскольку поле не заявлено в этом. Я не могу этого понять. Пожалуйста, предложите мне.

-raghu

...