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

dea*_*mon 9 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]
}
Run Code Online (Sandbox Code Playgroud)

如果我这样试试

select distinct i 
from Item i join i.tags t
where t in (:tags)
Run Code Online (Sandbox Code Playgroud)

我得到包含任何给定标签的项目.这并不奇怪,但我想要包含所有给定标签的Items .所以我反过来试试:

select distinct i 
from Item i join i.tags t
where (:tags) in t
Run Code Online (Sandbox Code Playgroud)

我收到错误消息org.hibernate.exception.SQLGrammarException: arguments of row IN must all be row expressions.如果tags仅包含单个标记,则它可以工作,但是失败的情况不止于此.

我怎样才能在JPQL中表达这一点?

dea*_*mon 16

诀窍是使用计数:

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

  • 这是使您永远看到它的那些事情之一,然后当您看到它时,您无法相信您一直都没有看到它 (2认同)