2010-09-15 32 views
5

Estoy usando Grails 1.2.4. Me gustaría saber cómo puedo ordenar por "countDistinct" (descendiendo) y con groupProperty dentro de las proyecciones.Usar groupProperty y countDistinct en Grails Criteria

Éstos son mis dominios:

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 términos de MySQL, esto es lo que quiero:

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

En términos generales, me gustaría obtener una lista de productos (o simplemente producto id) ordenados por el número de transacciones de un producto tenía (descendente)

Ésta es mi suposición:

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

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

Pero no da el resultado esperado. Cualquier pista sobre esto será muy apreciada. ¡Gracias!

Respuesta

7

Prueba esto:

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

Sus criterios de consulta es en realidad equivalente a:

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

Nota la diferencia. Desea contar la cantidad de transacciones distintas por producto, por lo que contar el ID de la transacción (o cualquier propiedad de transacción) tiene más sentido. La identificación del producto simplemente funciona sin la cláusula específica.

Puede activar el registro súper útil de hibernación de SQL para depurar este tipo de problema. Le mostrará exactamente cómo sus criterios se están transformando en SQL. En tiempo de ejecución:

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

o tirar esto en su Config.groovy:

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

Editar: countDistinct("id", "transactionCount") como la proyección y order("transactionCount") clasificará por el recuento.

+0

gracias! funcionó. sin embargo, no mencionó cómo ordenar por 'count (product_id) desc' en createCriteria – firnnauriel

Cuestiones relacionadas