2012-12-20 45 views
5

考慮以下幾點:如何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; 
    } 
} 

如何鍵入JPA2 CriteriaQuery中表達它,比方說,讓我找到所有有2名以上的作者的書?

回答

10

在JPQL:

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

使用標準的API(但爲什麼你會替換爲以下惹這麼簡單的靜態查詢):

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

謝謝,這是有益的;我正在努力將URI查詢語言映射到JPA2表達式 - CriteriaQuery API,雖然在某些情況下冗長並且可以說不靈活,但適合於此目的; JPQL最初也支持 - 所以額外感謝另一個提示; btw - 是實際需要的select()還是應該「em.createQuery(criteriaQuery).getResultList()」而不是? –

+1

我想我已經能夠執行查詢沒有選擇。但是它與Hibernate一樣,不需要在HQL查詢中選擇,而JPQL需要它們。我會添加一個select子句,只是爲了確保。 –

+0

<爲1遞增>,但爲什麼要用下面的混亂替換這樣一個簡單的靜態查詢?「 – aroth