2011-07-20 51 views
1

我使用grails 1.2.1中的GORM。目前沒有升級的機會。這本身不是Grails應用程序;相反,它是一個使用groovy並利用GORM實現簡單域模型持久性的web應用程序。Grails GORM - 使用聚合函數時如何獲得PagedResultList

我有這樣的查詢:

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') 
       } 

即改變通過最大,並通過初始的地圖參數抵消參數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」的功能了?

更新:Raised on Grails JIRA建議 - 我沒有在freenode的#grails上得到回覆。

回答

0

它沒有記錄非常好,但把你的分頁PARAMS在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 issue

另外,這裏有一些鏈接解釋不良記錄PagedResultList ...

HereHere

+0

對不起,我不UND據此。我不清楚這與我給出的失敗案例有何不同?我試過你的建議(這似乎是指定最大和偏移兩次?),並仍然得到相同的例外。請你能幫我理解我錯過了什麼嗎? – jabley

+0

我已經更新了我的答案... –

+0

我的投影查詢在第一個實例中工作,但不在第二個實例中。 AFAICT唯一的區別是,我可以看到,在第二個代碼中,我通過'Map'作爲第一個參數傳遞'max'和'offset'參數,試圖獲得一個'PagedResultList'返回按照[文檔](http://www.grails。組織/ DOC /最新/ REF /域%20Classes/createCriteria.html)。所以我的問題可以重新定義爲「爲什麼不投影查詢工作,當我嘗試獲取PagedResultList」 – jabley