Grails GORM - Как получить PagedResultList при использовании функций агрегации - PullRequest
1 голос
/ 20 июля 2011

Я использую GORM из Грааля 1.2.1.Нет шансов на обновление в этот момент.Это не приложение Grails само по себе;скорее это веб-приложение, которое использует groovy и использует GORM для простого сохранения модели домена.

У меня такой запрос:

actionsByUser = UserAction.createCriteria().list() {
                    projections {
                        countDistinct('id', 'userCount')
                        groupProperty('user')
                    }
                    firstResult(offset)
                    maxResults(max)
                    order('userCount', 'desc')
                }

, который не возвращает мне PagedResultList с getTotalCountметод, который показывает, сколько результатов, и дает мне знать, когда отображать следующую ссылку, чтобы показать следующую страницу результатов.

Я пробовал что-то вроде этого:

actionsByUser = UserAction.createCriteria().list(max:max, offset:offset) {
                    projections {
                        countDistinct('id', 'userCount')
                        groupProperty('user')
                    }
                    order('userCount', 'desc')
                }

, т.е.изменить, чтобы передать параметры max и offset через начальный параметр Map в list, вместо использования DSL в замыкании.

Сбой при:

org.hibernate.QueryException: could not resolve property: userCount of: example.domain.UserAction
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:61)
at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1392)
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:54)
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1367)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:457)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:417)
at org.hibernate.criterion.Order.toSqlString(Order.java:68)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getOrderBy(CriteriaQueryTranslator.java:371)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:113)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:91)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1578)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1025)

Как я могуполучить результат обратно из Grails, который подходит для выполнения функции "страница 1 из n"?

ОБНОВЛЕНИЕ: Поднято на Grails JIRA , как было предложено - я не сделалполучить ответ на # grails на freenode.

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

Проблема в том, что запрос HibernateCriteria не распознает псевдоним, определенный в проекциях, что является причиной ошибки «невозможно разрешить свойство», проблема еще не устранена

вот билет на джира http://jira.grails.org/browse/GRAILS-3875

0 голосов
/ 20 июля 2011

Это не очень хорошо задокументировано, но укажите ваши параметры нумерации страниц в createCriteria.list([in here!]), это должно вернуть вам PagedResultList

пример ...

def result=Thing.createCriteria().list(max:params.max, offset:params.offset){
   maxResults(params.max)
   firstResult(params.offset)
} 

[UPDATE]

Похоже, ваша ошибка связана с неверным запросом could not resolve property: userCount. Посмотрите еще раз на ваш запрос проекции. На первый взгляд все выглядит нормально и возникла проблема jira , которая, похоже, была решена в Grails 1.2.

Кроме того, вот несколько ссылок, объясняющих плохо документированный PagedResultList ...

Здесь и Здесь

...