Requête GORM Hibernate
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.
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)
}
}