2010-03-24 20 views
9

Trochę utknąłem podczas konstruowania zapytania dynamicznego za pomocą narzędzia CriteriaBuilder of JPA 2.0.Zapytanie dynamiczne JPA 2.0 za pomocą API Criteria

mam dość powszechny przypadek użycia Chyba Użytkownik dostarcza dowolną ilość parametrów wyszukiwania X będzie i/lub łączone: jak:

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

Metoda lub CriteriaBuilder nie jest dynamiczna:

Predykat lub (ograniczenia orzecznicze ...)

Pomysły? Próbki?

Odpowiedz

7

W twoim przypadku, wolałbym użyć Expression#in(Collection) aby uniknąć pętli i zbudować związek Predicate dynamicznie:

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)); 

Możesz chcieć sprawdzić Basic Type-Safe Queries Using the Criteria API and Metamodel API więcej szczegółów.

+0

Witam, Pascal Thivent, jeśli params jest podzapytaniem, jak można napisać kod? –

1

w tym kodzie Foo_.name spowoduje błąd kompilacji. Ponieważ pole nie jest w nim zadeklarowane. Nie jestem w stanie tego zrozumieć. Proszę, zasugeruj mi.

-raghu

+3

Powyższy przykład jest oparty na metamodelu klas zarządzanych jednostki trwałości (które można wygenerować za pomocą procesora adnotacji dostarczonego przez implementację JPA). Ale proszę, nie publikuj pytań jako odpowiedzi w istniejącym wątku, zamiast tego otwórz nowe pytanie. –

Powiązane problemy