2010-09-15 8 views
5

Sto utilizzando Grails 1.2.4. Mi piacerebbe sapere come posso ordinare per "countDistinct" (discendente) e con groupProperty all'interno di una proiezione.Utilizzo di groupProperty e countDistinct nei criteri Grails

Qui sono i miei domini:

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

In termini di MySQL, questo è quello che voglio:

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

In termine generico, vorrei ottenere un elenco di prodotti (o solo prodotto id) in ordine di numero di transazioni che un prodotto era (discendente)

Questa è la mia ipotesi:

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

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

Ma non fornisce il risultato atteso. Qualsiasi vantaggio su questo sarà molto apprezzato. Grazie!

risposta

7

Prova questo:

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

suoi criteri di query è in realtà equivale a:

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

Annotare la distinta. Si desidera calcolare il numero di transazioni distinte per prodotto, quindi è più opportuno conteggiare l'ID della transazione (o qualsiasi proprietà della transazione). L'ID prodotto funziona semplicemente senza la clausola distinta.

È possibile attivare la superba registrazione SQL di ibernazione per eseguire il debug di questo tipo di problema. Ti mostrerà esattamente come i tuoi criteri vengono trasformati in SQL. In fase di esecuzione:

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

o buttare questo nel vostro Config.groovy:

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

EDIT: utilizzare countDistinct("id", "transactionCount") come la proiezione e order("transactionCount") ordinerà dal conte.

+0

grazie! ha funzionato. tuttavia, non hai menzionato come ordinare per 'count (product_id) desc' in createCriteria – firnnauriel

Problemi correlati