2010-03-24 10 views
9

Ich bin ein wenig stecken geblieben, eine dynamische Abfrage mit dem CriteriaBuilder von JPA 2.0 zu erstellen.Dynamische JPA 2.0-Abfrage mit Criteria API

Ich habe eine recht gebräuchlichen Fall, dass ich denke: User eine beliebige Anzahl von Suchparametern X liefern zu sein und/oder verketteten: wie:

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

Die Methode oder des CriteriaBuilder ist nicht dynamisch:

Prädikat oder (Prädikat ... Einschränkungen)

Ideen? Proben?

Antwort

7

In Ihrem Fall würde ich lieber Expression#in(Collection) verwenden, um Schleife zu vermeiden, und eine Verbindung Predicate dynamisch zu bauen:

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

Sie könnten Basic Type-Safe Queries Using the Criteria API and Metamodel API um weitere Informationen überprüfen möchten.

+0

Hallo, Pascal Thivent, Wenn die params eine Unterabfrage ist, wie kann den Code schreiben? –

1

in diesem Code wird Foo_.name Kompilierungsfehler geben. Da das Feld darin nicht deklariert ist. Ich kann das nicht verstehen. Bitte schlage mich vor.

-raghu

+3

Das obige Beispiel basiert auf einem Metamodell der verwalteten Klassen der Persistenzeinheit (die mit einem von der JPA-Implementierung bereitgestellten Annotationsprozessor generiert werden können). Aber bitte posten Sie keine Fragen als Antworten im bestehenden Thread, sondern öffnen Sie stattdessen eine neue Frage. –

Verwandte Themen