【问题标题】:Grails GORM - How to get a PagedResultList when using aggregation functionsGrails GORM - 使用聚合函数时如何获取 PagedResultList
【发布时间】:2011-10-09 06:19:38
【问题描述】:

我正在使用来自 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 页”功能的结果?

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

【问题讨论】:

    标签: hibernate grails grails-orm hibernate-criteria


    【解决方案1】:

    它没有很好地记录,但将您的分页参数放在 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 有关。再看看您的投影查询。 乍一看似乎还可以,并且有一个 jira issue 似乎在 Grails 1.2 中得到了解决。

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

    HereHere

    【讨论】:

    • 对不起,我不明白。我不清楚这与我给出的失败示例有何不同?我尝试了您的建议(似乎只是指定了两次最大值和偏移量?)并且仍然得到相同的异常。请你能帮我理解我错过了什么吗?
    • 我的投影查询在第一个实例中有效,但在第二个实例中无效。 AFAICT 我能看到的唯一区别是,在第二段代码中,我通过Map 作为第一个参数传递maxoffset 参数,以尝试获得PagedResultList按照documentation返回。所以我的问题可以重新定义为“当我尝试取回 PagedResultList 时,为什么投影查询不起作用”
    • 我怀疑预测不适用于list(Map, Closure)
    • @jabely 如果是这种情况(+1 你的问题),我不会感到惊讶。也许将问题发布到 Jira?
    【解决方案2】:

    问题是 HibernateCriteria 查询不理解投影中定义的别名,这是错误“无法解析属性”的原因,问题尚未解决

    这是jira票 http://jira.grails.org/browse/GRAILS-3875

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2011-08-18
      相关资源
      最近更新 更多