2010-09-15 5 views
5

J'utilise Grails 1.2.4. Je voudrais savoir comment je peux trier par "countDistinct" (descendant) et avec groupProperty dans une projection.Utilisation de groupProperty et countDistinct dans Grails Critères

Voici mes domaines:

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

En ce qui concerne MySQL, ce que je veux:

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

En terme général, je voudrais obtenir une liste des produits (ou tout simplement produit id), triées par le nombre de transactions un produit HAD (décroissant)

Ceci est ma conjecture:

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

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

Mais cela ne donne pas le résultat escompté. Toute piste à ce sujet sera grandement appréciée. Merci!

Répondre

7

Essayez ceci:

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

recherche Vos critères est équivalent à:

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

Notez le distinct. Vous souhaitez compter le nombre de transactions distinctes par produit, le décompte de l'identifiant de transaction (ou de toute propriété de transaction) est donc plus logique. L'ID de produit arrive juste à fonctionner sans la clause distincte.

Vous pouvez activer la journalisation SQL hibernate super utile pour le débogage de ce type de problème. Il vous montrera exactement comment vos critères sont transformés en SQL. Lors de l'exécution:

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

ou jeter dans votre Config.groovy:

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

EDIT: utiliser countDistinct("id", "transactionCount") comme la projection et order("transactionCount") triera par le comte.

+0

merci! ça a marché. Cependant, vous n'avez pas mentionné comment trier par 'count (product_id) desc' dans createCriteria – firnnauriel

Questions connexes