with query create java sql hibernate jpa jpql

java - query - jpql order by



Encontrar elementos con un conjunto que contiene todos los elementos de un conjunto determinado con jpql (2)

Quiero encontrar los elementos que contienen todas las etiquetas dadas en sus etiquetas establecidas.

Estas son las clases simplificadas:

@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] }

Si lo intento así

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

Obtengo los artículos que contienen cualquiera de las etiquetas dadas. Eso no es sorprendente, pero quiero artículos que contengan todas las etiquetas dadas. Entonces lo intento al revés:

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 mensaje de error org.hibernate.exception.SQLGrammarException: arguments of row IN must all be row expressions . Funciona si las tags contienen solo una etiqueta, pero falla con más de eso.

¿Cómo puedo expresar esto en JPQL?


El truco es usar un conteo:

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


Solo tuve el mismo problema que tú. Usé la 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)