2013-01-15 74 views
7

我想查找包含所有項目的標籤集合中給定的標籤。使用jpql查找包含給定集合的所有元素的集合的項目

這裏是簡化類:

@Entity 
class Item { 
    @ManyToMany 
    var tags: java.util.Set[Tag] = new java.util.HashSet[Tag]() 
} 

@Entity 
class Tag { 
    @ManyToMany(mappedBy="tags") 
    var items: java.util.Set[Item] = new java.util.HashSet[Item] 
} 

如果我試圖像這樣

select distinct i 
from Item i join i.tags t 
where t in (:tags) 

我得到包含特定標記的任何的項目。這並不奇怪,但我想要的項目包含全部的給定標籤。所以我反過來試試:

select distinct i 
from Item i join i.tags t 
where (:tags) in t 

我收到錯誤信息org.hibernate.exception.SQLGrammarException: arguments of row IN must all be row expressions。它可以工作,如果tags只包含一個標籤,但它失敗的不止於此。

如何在JPQL中表達這一點?

+0

因爲我覺得你不能在hibernate中與其他數組進行比較。我認爲你必須重寫你的sql查詢代碼。 –

+0

Query query = session.createQuery(「from Stock where stockId in(:code)」); query.setParameterList(「code」,idList); –

+0

我很欣賞你在你的問題中展示瞭如何獲得包含任何給定標籤的物品!這就是我正在尋找的東西。我可以確認它也適用於'@ ElementCollection's。 –

回答

8

訣竅是使用計數:

select i from Item i join i.tags t 
where t in :tags group by i.id having count(i.id) = :tagCount 
+0

這是需要你永遠看到它的東西之一,然後當你這樣做時,你不能相信你沒有看到它一直以來 –

2

我有同樣的問題,因爲你。我使用了reductio ad absurdum:

select distinct i from Item i where i not in (select i2 from Item i2 join i2.tags t where t not in :tags) 
+0

我喜歡這種方法,因爲我已經有一個查詢返回了我所做的不需要,但是我需要爲內部選擇添加一些條件,以便子查詢結果保持較小。相反,我使用這裏描述的計數方法http://stackoverflow.com/a/21645545/429896,不需要在「group by」之後添加內容。 – HypeXR

相關問題