1

我正在使用来自 grails 1.2.1 的 GORM。目前没有升级的机会。这本身不是一个 grails 应用程序。相反,它是一个使用 groovy 并利用 GORM 轻松实现域模型持久性的 web 应用程序。

我有一个这样的查询:

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

这不会给我返回一个带有 getTotalCount 方法的 PagedResultList,它会指示有多少结果,并让我知道何时显示下一个链接以显示下一页结果。

我尝试了这样的事情:

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

即更改为通过初始 Map 参数将 max 和 offset 参数传递给list,而不是在 Closure 中使用 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 中获取适合执行“n 页第 1 页”功能的结果?

更新:按照建议 在 Grails JIRA上提出 - 我没有在 freenode 上的#grails 上得到回复。

4

2 回答 2

0

The problem is HibernateCriteria query does not understand alias defined in projections which is the reason for error "unable to resolve property", the issue yet to be fixed

here is the jira ticket http://jira.grails.org/browse/GRAILS-3875

于 2012-03-16T04:09:11.230 回答
0

它没有很好地记录,但把你的分页参数放在createCriteria.list([in here!])这应该会给你一个PagedResultList

例子...

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

[更新]

您的错误似乎与无效查询有关could not resolve property: userCount。再看看您的投影查询。 乍一看,这似乎还不错,并且似乎在 Grails 1.2 中解决了一个jira 问题。

此外,这里有一些链接解释了记录不佳的 PagedResultList ...

这里这里

于 2011-07-20T10:26:25.010 回答