2012-12-20 10 views
5

Rozważmy następujący:Jak sprawdzić rozmiar kolekcji w 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; 
    } 
} 

Jak wpisać wyrażenie JPA2 CriteriaQuery który, powiedzmy, pozwoli mi znaleźć wszystkie książki, które mają więcej niż 2 autorów?

Odpowiedz

10

W JPQL:

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

stosując kryteria API (ale dlaczego chcesz wymienić takie proste zapytanie statyczną o następującej bałagan?):

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

Dziękuję, to jest pomocne; Pracuję nad odwzorowaniem języka zapytań URI na wyrażenia JPA2 - API CriteriaQuery, przy czym bycie gadatliwym i prawdopodobnie nieelastycznym w niektórych przypadkach pasuje całkiem dobrze do tego celu; JPQL jest również początkowo obsługiwany - więc dodatkowe podziękowania za inną podpowiedź; btw - jest select() rzeczywiście potrzebne, czy też "em.createQuery (criteriaQuery) .getResultList()" wykonaj zamiast tego? –

+1

Myślę, że udało mi się wykonać zapytania bez wyboru. Ale to było z Hibernate, który nie potrzebuje wyboru w zapytaniach HQL, podczas gdy JPQL ich wymaga. Dodałbym klauzulę wyboru, aby mieć pewność. –

+0

dla "ale dlaczego zastąpiłbyś tak proste statyczne zapytanie następującym bałaganem?" – aroth

Powiązane problemy