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.

¿Fue útil?

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)
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top