GORM Hibernate запрос
Вопрос
У меня есть следующие доменные объекты Grails
class ProductType {
String name
static hasMany = [attributes: Attribute]
}
class Attribute {
Boolean mandatory = false
Integer seq
static belongsTo = [productType: ProductType]
}
Я хотел бы получить все ProductType
и их обязательные атрибуты
. Кроме того, я бы хотел, чтобы выбранные Атрибуты
были загружены и отсортированы с помощью свойства seq
. Я пробовал все виды запросов HQL и Criteria, но, похоже, не могу понять.
Решение
Этот запрос вернет все типы ProductType, которые имеют обязательные атрибуты, с такими загруженными атрибутами:
def types = ProductType.executeQuery("""
select distinct type from ProductType type
left join fetch type.attributes attribute
where attribute.mandatory=true""")
Атрибуты находятся в отображенных наборах, поэтому упорядочения нет, но их достаточно просто собрать и отсортировать:
def sortedAttributes = types.collect { it.attributes }.flatten().sort { it.seq }
Другие советы
Кроме того, вы можете получить отсортированный список многих сторон, реализовав Comparable Interface в домене многих сторон и добавив SortedSet в одну сторону (вместо набора по умолчанию).
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)
}
}