10

タグセットに指定されたすべてのタグを含むアイテムを見つけたいです。

単純化されたクラスは次のとおりです。

@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。タグが 1 つしか含まれていない場合tagsは機能しますが、それ以上の場合は失敗します。

これをJPQLでどのように表現できますか?

4

2 に答える 2

19

トリックはカウントを使用することです:

select i from Item i join i.tags t
where t in :tags group by i.id having count(i.id) = :tagCount
于 2013-01-15T21:51:24.980 に答える