2012-02-07 10 views
13

È possibile interrogare graal con criteri e ricevere un elenco di mappe anziché un elenco di elenchi? Mi piacerebbe avere i nomi delle colonne nei risultati per poter poi lavorare con un 'array associativo' piuttosto che con offset di array numerici. Io attualmente faccio qualcosa di simileDomande Grails con criteri: come recuperare una mappa con colonna?

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

che si traduce in [[123, app.User:1][111, app.User:2][...]...], cioè una lista di liste. Preferirei qualcosa come [[posts:123, author: app.User:1][posts: 111, author app.User:2][...]...].

Come sempre: l'aiuto è molto apprezzato!

risposta

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

Grazie per la risposta. Certo che posso trasformare il risultato in seguito - questo è quello che sto facendo al momento. Poi di nuovo voglio saltare l'overhead della postelaborazione del set di risultati. Immagino che da qualche parte nel codice di ibernazione la stessa trasformazione avvenga comunque ... – fluxon

+0

Poco dopo averlo postato, mi è venuto in mente che non ti interessava una soluzione in due passaggi. –

+0

Nessun problema! Grazie comunque per il tuo supporto! se è semplicemente fantastico! – fluxon

30

Usa resultTransformer(). Come parametro utilizzare CriteriaSpecification.ALIAS_TO_ENTITY_MAP
La documentazione e gli esempi su questo argomento sono scarsi. Ma ecco un esempio: è necessario

import org.hibernate.criterion.CriteriaSpecification 

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

Nota che alias per tutte le proiezioni. Altrimenti, la mappa risultante è costituita da null.

+0

Brillante ed elegante. Grazie mille Sergey. –

+0

Eccellente ....... Grazie mille .... – akiong

Problemi correlati