2010-03-24 3 views
9

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

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

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

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

Predicate or (Предикативные ...)

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

ответ

7

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

Вы можете проверить Basic Type-Safe Queries Using the Criteria API and Metamodel API для более подробной информации.

+0

Привет, Паскаль Thivent, Если PARAMS является подзапрос, как можно написать код? –

1

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

-raghu

+3

Вышеприведенный пример основан на метамоделе управляемых классов единицы сохранения (которые могут быть сгенерированы с использованием обработчика аннотаций, предоставленного реализацией JPA). Но, пожалуйста, не публикуйте вопросы как ответы в существующей теме, вместо этого откройте новый вопрос. –

Смежные вопросы