2009-09-15 11 views
1

Je le domaine Grails objets suivantsGORM Hibernate requête

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

class Attribute { 

    Boolean mandatory = false 
    Integer seq 

    static belongsTo = [productType: ProductType] 
} 

Je voudrais obtenir tous les ProductType s et leurs Attribute obligatoires s. De plus, j'aimerais que les Attribute sélectionnés soient rapidement chargés et triés par la propriété seq. J'ai essayé toutes sortes de requêtes HQL et Criteria, mais je n'arrive pas à le comprendre.

Répondre

1

Cette requête renverra tous les ProductTypes qui ont des attributs obligatoires, avec ces attributs avec impatience chargés:

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

Les attributs sont en jeux mis en correspondance, donc il n'y a pas de commande, mais il est assez facile de collecter et de les trier:

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

vous pouvez obtenir une liste triée des nombreux côté en mettant en œuvre une interface comparable dans le domaine de nombreux côté, et l'injection SortedSet dans l'un côté (au lieu de la valeur par défaut Set).

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) 
    } 
}