2014-07-20 74 views
1

我有一個實體「郵報」與此屬性:JPQL SELECT ElementCollection

@ElementCollection 
@CollectionTable(name ="tags") 
private List<String> tags = new ArrayList<>(); 

然後我有一組由天然選擇查詢。現在的問題是如何選擇屬性標籤?

我的選擇查詢:

Query query = em.createQuery("SELECT p.id,MAX(p.createdAt),MAX(p.value) FROM Post p JOIN p.tags t WHERE t IN (?1,?2,?3) GROUP BY p.id ORDER BY COUNT(p) DESC"); 
    /* ... 

    query.setFirstResult(startIndex); 
    query.setMaxResults(maxResults); 
    List<Object[]> results = query.getResultList(); 

    List<Post> posts = new ArrayList<>(); 
    for (Object[] result : results) { 
     Post newPost = new Post(); 
     newPost.setId(((Number) result[0]).longValue()); 
     newPost.setCreatedAt((Date) result[1]); 
     newPost.setValue((String) result[2]); 
     posts.add(newPost); 
    } 
    return posts; 

如何選擇屬性標記?

回答

1

不知道它是否會有所幫助,但在JPA2.1規格,部分4.4.6集合成員聲明,你可以這樣做:

SELECT DISTINCT o 
FROM Order o, IN(o.lineItems) l 
WHERE l.product.productType = ‘office_supplies’ 

所以我想用你的情況,你可以嘗試:

SELECT p.id,MAX(p.createdAt),MAX(p.value), t 
FROM Post p, IN(p.tags) t 
WHERE t IN (?1,?2,?3) 
GROUP BY p.id, t 
ORDER BY COUNT(p) DESC 

注:我加入叔到GROUP BY,因爲它不會與查詢,而無需使用聚合函數工作。

+0

謝謝,但現在我得到每個標籤相同的實體,因爲由t組。我想選擇t作爲列表。這可能嗎? – perotom

+0

事實上,在重讀你的查詢之後,我不明白你爲什麼要用p.createDate,p.value做一個MAX,而用p.id進行分組,這可能是一個主鍵=>刪除組,使用lazy(或eager)加載,例如:'for(Post post:results)post.getTags();' – NoDataFound

+0

我剛剛解決了這個問題,因爲我現在只選擇了所有屬性的p。 – perotom