Pergunta

Eu tenho as seguintes objetos de domínio Grails

class ProductType {
    String name
    static hasMany = [attributes: Attribute]
}

class Attribute {

    Boolean mandatory = false
    Integer seq

    static belongsTo = [productType: ProductType]
}

Gostaria de obter todos ProductTypes e seus Attributes obrigatórios. Além disso, eu gostaria que o Attributes selecionados para serem carregados ansiosamente e classificadas pela propriedade seq. Eu tentei todos os tipos de consultas HQL e critérios, mas não consigo descobrir isso.

Foi útil?

Solução

Esta consulta retornará todos os ProductTypes que têm atributos obrigatórios, com esses atributos ansiosamente carregada:

def types = ProductType.executeQuery("""
   select distinct type from ProductType type
   left join fetch type.attributes attribute
   where attribute.mandatory=true""")

Os atributos são em Conjuntos mapeadas, então não há nenhuma ordenação, mas é fácil o suficiente para recolher e classificar-los:

def sortedAttributes = types.collect { it.attributes }.flatten().sort { it.seq }

Outras dicas

Como alternativa, você pode obter uma lista ordenada de lado muitos através da implementação de uma interface comparável no domínio de lado muitos, e injetando SortedSet em um lado (em vez do conjunto padrão).

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top