2012-12-20 4 views
5

Beachten Sie Folgendes überprüfen:Wie eine Sammlung Größe in JPA2

@Entity 
public class Book 
{ 
    private List<String> authors; 
    @ElementCollection 
    public List<String> getAuthors() { 
     return authors; 
    } 

    public void setAuthors(List<String> authors) { 
     this.authors = authors; 
    } 
} 

Wie ein JPA2 CriteriaQuery Ausdruck geben, die, sagen wir, mir alle Bücher finden lassen, die mehr als zwei Autoren haben?

Antwort

10

In JPQL:

select b from Book where size(b.authors) >= 2 

den Kriterien-API (aber warum sollte man eine so einfache statische Abfrage mit dem folgende Chaos ersetzen?):

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Book> criteriaQuery = cb.createQuery(Book.class); 
Root<Book> book = criteria.from(Book.class); 
Predicate predicate = cb.ge(cb.size(book.get(Book_.authors)), 2); 
criteriaQuery.where(predicate); 
criteriaQuery.select(
+0

Danke, das ist hilfreich; Ich arbeite an der Zuordnung einer URI-Abfragesprache zu JPA2-Ausdrücken - CriteriaQuery API, während in einigen Fällen verbose und wohl unflexible passt ziemlich gut für den Zweck; JPQL wird auch anfänglich unterstützt - also vielen Dank für einen weiteren Hinweis; btw - wird select() tatsächlich benötigt oder sollte "em.createQuery (criteriaQuery) .getResultList()" stattdessen folgen? –

+1

Ich glaube, ich konnte Abfragen ohne Auswahl ausführen. Aber es war mit Hibernate, die auch in HQL-Abfragen nicht auswählen müssen, während JPQL sie benötigt. Ich würde eine Auswahlklausel hinzufügen, nur um sicher zu sein. –

+0

für "aber warum würden Sie eine solche einfache statische Abfrage durch die folgende Unordnung ersetzen?" – aroth