Поиск элементов с набором, содержащим все элементы заданного набора с 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] } 

Если я попробую это так

 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?

Хитрость заключается в использовании счетчика:

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

У меня была такая же проблема, как и вы. Я использовал 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)