2010-09-15 56 views
5

我正在使用Grails 1.2.4。我想知道如何通過「countDistinct」(降序)和groupProperty在預測中進行排序。在Grails標準中使用groupProperty和countDistinct

這裏是我的域:

class Transaction { 

    static belongsTo = [ customer : Customer, product : Product ] 

    Date transactionDate = new Date() 

    static constraints = { 
     transactionDate(blank:false)  
    } 

} 

class Product { 

    String productCode 

    static constraints = { 
     productCode(blank:false)  
    } 
} 

在MySQL來說,這就是我想要的:

select 
    product_id, 
    count(product_id) 
from 
    transaction 
group by 
    product_id 
order by 
    count(product_id) desc 

總體來看,我想獲得的產品清單(或不僅僅是產品ID)通過交易產品有(降序)

數進行排序這是我的猜測:

def c = Transaction.createCriteria() def transactions = c.list { 
    projections { 
     groupProperty("product") 
     countDistinct("product") 
    } 
    maxResults(pageBlock) 
    firstResult(pageIndex) } 

def products = transactions.collect { it[0] } 

但它沒有給我預期的結果。任何領先的這將是高度讚賞。謝謝!

回答

7

試試這個:

def c = Transaction.createCriteria() 
def transactions = c.list { 
    projections { 
     groupProperty("product") 
     countDistinct("id") 
    } 
    maxResults(pageBlock) 
    firstResult(pageIndex) 
} 

你的條件查詢實際上等同於:

select 
    product_id, 
    count(**distinct** product_id) 
from 
    transaction 
group by 
    product_id 
order by 
    count(product_id) desc 

注意的是不同的。您想要計算每個產品的不同交易數量,因此計算交易ID(或任何交易屬性)更有意義。產品id只是在沒有獨特子句的情況下才能運行。

您可以打開超級有用的hibernate SQL日誌記錄來調試這類問題。它會向你顯示你的標準是如何轉換成SQL的。在運行時:

org.apache.log4j.Logger.getLogger("org.hibernate").setLevel(org.apache.log4j.Level.DEBUG) 

或在您的Config.groovy中拋出這樣的:

environments { 
    development { 
     log4j = { 
      debug 'org.hibernate' 
      } 
    } 
} 

編輯:使用countDistinct("id", "transactionCount")作爲投影和order("transactionCount")將由數排序。

+0

謝謝!有效。不過,您並未提及如何在createCriteria中按'count(product_id)desc'進行排序 – firnnauriel 2010-09-16 09:20:59