使用包含jpql的给定集合的所有元素的集合查找项目

时间:2013-01-15 14:44:08

标签: java sql hibernate jpa jpql

我想在标签集中找到包含 all 给定标签的项目。

以下是简化类:

@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中表达这一点?

2 个答案:

答案 0 :(得分:12)

诀窍是使用计数:

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

答案 1 :(得分: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)