使用jpql查找包含给定集合的所有元素的集合 [英] Finding items with a set containing all elements of a given set with jpql
问题描述
我想查找包含所有标签集中给定标签的项目。
以下是简化的类:
@Entity
class Item {
@ManyToMany
var tags:java.util.Set [Tag] = new java.util.HashSet [Tag]()
}
@Entity
类标记{
@ManyToMany(mappedBy =tags)
var items:java.util.Set [Item] = new java.util.HashSet [Item]
}
如果我尝试这样做
从项目中选择不同的
pre>
我加入i.tags t
其中t((:tags)
我得到包含任何的给定标签的项目。这并不奇怪,但我想要包含所有的给定标签的项目。所以我反过来试试:
从项目中选择不同的
我加入i.tags t
where(:tags)in t
我得到错误信息
org .hibernate.exception.SQLGrammarException:行IN的参数必须都是行表达式
。如果标签
只包含一个标签,但它失败的次数超过了这个标签,它就可以工作。
我如何表达这在JPQL?
解决方案诀窍是使用一个计数:
从项目中选择i我加入i.tags t
其中t in:标签组由i.id计数(i.id)=:tagCount
I want to find the items that contain all the given tags in their tags set.
Here are the simplified classes:
@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] }
If I try it like this
select distinct i from Item i join i.tags t where t in (:tags)
I get the items that contain any of the given tags. That is not surprising, but I want Items that contain all of the given tags. So I try it the other way around:
select distinct i from Item i join i.tags t where (:tags) in t
I get the error message
org.hibernate.exception.SQLGrammarException: arguments of row IN must all be row expressions
. It works iftags
contains only a single tag, but it fails with more than that.How can I express this in JPQL?
解决方案The trick is to use a count:
select i from Item i join i.tags t where t in :tags group by i.id having count(i.id) = :tagCount
这篇关于使用jpql查找包含给定集合的所有元素的集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!