consulta GORM Hibernate
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 ProductType
s e seus Attribute
s obrigatórios. Além disso, eu gostaria que o Attribute
s 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.
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)
}
}