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

Java 使用jpql查找包含给定集合的所有元素的集合中的项,java,sql,hibernate,jpa,jpql,Java,Sql,Hibernate,Jpa,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] } 如

我想在标记集中找到包含所有给定标记的项目

以下是简化类:

@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.sqlgrammareexception:IN行的参数必须都是行表达式
。如果
标签
只包含一个标签,它就可以工作,但如果超过一个标签,它就会失败


如何在JPQL中表达这一点?

诀窍是使用计数:

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

我只是和你有同样的问题。我用了荒谬的还原法:

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

因为我认为在hibernate中无法将set与其他数组进行比较。我认为您必须重写sql查询代码;query.setParameterList(“代码”,idList);感谢您在问题中展示了如何获取包含任何给定标记的项目!这就是我要找的。我可以确认它也适用于
@ElementCollection
s。我喜欢这种方法,因为我已经有一个查询返回了我不想要的结果,但我需要向内部选择添加几个条件,以便子查询结果保持较小。相反,我使用了此处描述的计数方法,该方法不需要在“分组依据”之后添加内容。当
包含没有任何标记的元素时,我失败了。该方法不匹配所有给定的元素,而只匹配单个元素。中的子选择项将匹配,如果不在-并且不是“不在所有子选择项中”。您只是将初始问题覆盖到2中,但没有解决它。这相当于“从项目i中选择不同的i,其中i在(…标记)”中,因此不只匹配包含所有给定标记的项目。这是一件需要您永远才能看到它的事情,当您看到它时,您无法相信您一直都没有看到它