Как получить четкие результаты, используя Прогнозы и Критерии - PullRequest
7 голосов
/ 04 января 2011

Я пытаюсь загрузить разных родителей, используя критерии в Grails. Запрос выглядит следующим образом

Запрос:

def criteria = Parent.createCriteria();
        results =  criteria.list(max:params.max, offset:params.offset){
            projections{ groupProperty('id') }
            children{
                books{
                    like('title',"%book")
                    }
                }
            order("id","asc")
        }

Классы доменов

    class Parent {

    String name

    static hasMany = [children:Child]

    static constraints = {
    }
}


class Child {

        String name
        Parent parent

        static belongsTo = [parent:Parent]
        static hasMany =   [books:Book]
        static constraints = {
        }
    }


class Book {

        String title
        Child child

        static belongsTo = [child:Child]
        static constraints = {
        }
    }

Вопрос : Я не могу получить отдельные родительские строки.

Другие принятые подходы и их результаты: Я не знаю, почему groupProperty не работает. Я пробовал отчетливый в проекциях вместо groupProperty , и это тоже не плодотворно !. если я использую attribute.listDistinct вместо crit.list , тогда я могу получить отдельные родительские строки, но при более раннем подходе требуется получить totalCount из дополнительного запроса для разбивки на страницы , Поэтому я очень заинтересован в получении отдельных родительских строк, используя crit.list

Заранее спасибо

1 Ответ

3 голосов
/ 04 января 2011

Вы можете добиться того же эффекта, что и с criteria.listDistinct, если вы измените запрос критерия для включения отдельного преобразователя результатов корневого объекта, как это:

    results =  criteria.list(max:params.max, offset:params.offset){
        children{
            books{
                like('title',"%book")
                }
            }
         resultTransformer Criteria.DISTINCT_ROOT_ENTITY            
         order("id","asc")
    }

Однако есть причина, по которой grails не возвращает выгруженныйрезультаты для вызова listDistinct, поэтому может возникнуть необходимость прибегнуть к HQL-запросу с оператором in

...