2012-02-07 8 views
13

¿Es posible consultar griales con criterios y recibir una lista de mapas en lugar de una lista de listas? Me gustaría tener los nombres de las columnas en los resultados para luego trabajar con una 'matriz asociativa' en lugar de desplazamientos numéricos de la matriz. Actualmente hago algo así comoGrails consultas con criterios: ¿cómo volver un mapa con la columna?

def topFiveUsers = BlogEntry.createCriteria().list { 
     projections { 
      count('id') 
      groupProperty('author') 
     } 
     maxResults 5 
    } 

que se traduce en [[123, app.User:1][111, app.User:2][...]...], es decir, una lista de listas. Prefiero algo así como [[posts:123, author: app.User:1][posts: 111, author app.User:2][...]...].

Como siempre: ¡la ayuda es muy apreciada!

Respuesta

2
def topFiveList = [] 
topFiveUsers.each { rec -> 
    topFiveList << [posts: rec[0], author: rec[1]] 
} 
2
def converted = topFiveUsers.collect{ [posts: it[0], author: it[1]] } 
+0

Gracias por la respuesta. Por supuesto que puedo transformar el resultado más adelante, eso es lo que estoy haciendo en este momento. Por otra parte, quiero omitir la sobrecarga de posprocesar el conjunto de resultados. Supongo que en algún lugar del código de hibernación ocurre la misma transformación de todos modos ... – fluxon

+0

Poco después de publicar, se me ocurrió que no estaba interesado en una solución de dos pasos. –

+0

¡Sin preocupaciones! Gracias de todos modos por su apoyo! se es simplemente genial! – fluxon

30

Uso resultTransformer(). Como el parámetro use CriteriaSpecification.ALIAS_TO_ENTITY_MAP
La documentación y ejemplos sobre este tema son escasos. Pero he aquí un ejemplo:

import org.hibernate.criterion.CriteriaSpecification 

BlogEntry.withCriteria { 
    maxResults 5 
    resultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP) 
    projections { 
    count('id', 'total') 
    groupProperty('author', 'author') 
    }  
} 

Tenga en cuenta que se requiere alias para todas las proyecciones. De lo contrario, el mapa resultante consta de nulos.

+0

Brillante y elegante. Muchas gracias, Sergey. –

+0

Excelente ... Muchas gracias ... – akiong

Cuestiones relacionadas