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)