2010-09-15 14 views
5

Używam Grails 1.2.4. Chciałbym wiedzieć, w jaki sposób mogę sortować według "countDistinct" (malejąco) i groupProperty wewnątrz prognoz.Używanie groupProperty i countDistinct w Grails Criteria

Oto moje domeny:

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

Pod względem MySQL, to jest to, co chcę:

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

W ogólnym ujęciu, chciałbym, aby otrzymać listę produktów (lub po prostu produkt id) posortowana według liczby transakcji produkt mieli (malejąco)

to jest moje przypuszczenie:

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

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

Ale to nie daje oczekiwanych rezultatów. Jakakolwiek przewaga w tym będzie bardzo ceniona. Dzięki!

Odpowiedz

7

Spróbuj tego:

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

Twoje kryteria zapytanie jest rzeczywiście równoważne:

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

Uwaga odrębny. Chcesz policzyć liczbę odrębnych transakcji na produkt, więc zliczanie identyfikatora transakcji (lub dowolnej właściwości transakcji) ma więcej sensu. Identyfikator produktu działa po prostu bez odrębnej klauzuli.

Można włączyć super przydatne logowanie do hibernacji SQL w celu debugowania tego rodzaju problemu. Pokaże Ci dokładnie, w jaki sposób twoje kryteria są przekształcane w SQL. W czasie wykonywania:

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

albo rzucić to w Config.groovy:

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

EDIT: jak używać countDistinct("id", "transactionCount") projekcji i order("transactionCount") będzie sortować według zliczania.

+0

dzięki! zadziałało. jednak nie wspomniałeś, jak sortować według "count (product_id) desc" w createCriteria – firnnauriel

Powiązane problemy