Question

J'ai les objets de domaine Grails suivants

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

class Attribute {

    Boolean mandatory = false
    Integer seq

    static belongsTo = [productType: ProductType]
}

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

Était-ce utile?

La solution

Cette requête renvoie tous les ProductTypes dotés d'attributs obligatoires, avec ces attributs chargés avec impatience:

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

Les attributs sont dans des ensembles mappés. Il n'y a donc aucun ordre, mais il est assez facile de les collecter et de les trier:

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

Autres conseils

Vous pouvez également obtenir une liste triée du côté multiple en implémentant une interface comparable dans le domaine à plusieurs côtés et en injectant SortedSet dans le côté unique (au lieu du jeu par défaut).

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)
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top