Consulta de hibernación de GORM
Pregunta
Tengo los siguientes objetos de dominio de Grails
class ProductType {
String name
static hasMany = [attributes: Attribute]
}
class Attribute {
Boolean mandatory = false
Integer seq
static belongsTo = [productType: ProductType]
}
Me gustaría obtener todos los ProductType
sy sus obligatorios Attribute
s. Además, me gustaría que los Attribute
s seleccionados se carguen con entusiasmo y se ordenen por la propiedad seq
. He intentado todo tipo de consultas HQL y Criterios, pero parece que no puedo resolverlo.
Solución
Esta consulta devolverá todos los ProductTypes que tienen atributos obligatorios, con esos atributos cargados con entusiasmo:
def types = ProductType.executeQuery("""
select distinct type from ProductType type
left join fetch type.attributes attribute
where attribute.mandatory=true""")
Los atributos están en Conjuntos asignados, por lo que no hay ordenación, pero es bastante fácil recopilarlos y ordenarlos:
def sortedAttributes = types.collect { it.attributes }.flatten().sort { it.seq }
Otros consejos
Alternativamente, puede obtener una lista ordenada del lado múltiple implementando una Interfaz comparable en el dominio de varios lados e inyectando SortedSet en el lado único (en lugar del Conjunto predeterminado).
class ProductType {
String name
SortedSet attributes
static hasMany = [attributes: Attribute]
}
class Attribute implements Comparable {
Boolean mandatory = false
Integer seq
static belongsTo = [productType: ProductType]
int compareTo(obj) {
seq.compareTo(obj.seq)
}
}