GORM Hibernate-Abfrage
Frage
Ich habe folgende Grails Domain-Objekte
class ProductType {
String name
static hasMany = [attributes: Attribute]
}
class Attribute {
Boolean mandatory = false
Integer seq
static belongsTo = [productType: ProductType]
}
Ich möchte alle ProductType
s und ihre Pflicht Attribute
s bekommen. Außerdem würde ich die ausgewählten Attribute
s wie eifrig durch die seq
Eigenschaft geladen und sortiert werden. Ich habe alle Arten von HQL und Kriterien Abfragen versucht, aber kann nicht scheinen, um es herauszufinden.
Lösung
Diese Abfrage wird alle Produkttypen zurück, die obligatorischen Attribute haben, mit diesen Attributen mit Spannung geladen:
def types = ProductType.executeQuery("""
select distinct type from ProductType type
left join fetch type.attributes attribute
where attribute.mandatory=true""")
Die Attribute sind in abgebildet Sets, so gibt es keine Ordnung, aber es ist einfach genug, um zu sammeln und zu sortieren:
def sortedAttributes = types.collect { it.attributes }.flatten().sort { it.seq }
Andere Tipps
Alternativ können Sie eine sortierte Liste der vielen Neben erhalten, indem eine vergleichbare Schnittstelle in der vielseitigen Bereich Implementierung und SortedSet in der einseitigen (anstelle des Standard-Set) injiziert wird.
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)
}
}