Вопрос

У меня есть следующие доменные объекты 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)
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top