2011-01-19 7 views
10

Ho questa tabella:Con Hibernate, come posso interrogare una tabella e restituire una hashmap con id coppia chiave valore> nome?

table name : Account 
Fields : id (varchar), name(varchar), other fields... 

Voglio interrogare questa tabella con il meccanismo di sospensione (per utilizzare il secondo livello di cache). Il risultato della query di ibernazione deve essere una mappa di hash in cui la chiave è l'id del campo e in cui il valore è il nome del campo.

Come posso scrivere con HQL?

Se utilizzo la mappa, posso solo utilizzare l'alias e se utilizzo un costruttore con un oggetto, devo trasformare il risultato in hashmap che richiede molto tempo.

Example : 
Id | name | other fields 
1 Jerome ... 
2 Steve ... 
3 Nick ... 

il risultato della query deve essere una HashMap:

1>Jerome 
2>Steve 
3>Nick 

grazie

risposta

11

Questa domanda è vecchia ma potrebbe ancora aiutare altre persone. Ora è possibile utilizzare HQL per restituire le mappe con la sospensione. Usa qualcosa come questo:

select new map(max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n) from Cat cat 

Da docs Hibernate: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-select

+4

circa 1 anno 1/2, aggiorno la mia risposta accettata! Questo era esattamente quello che cercavo. Questo è un po 'troppo tardi ma un'informazione utile! –

5

Credo che il più vicino si può ottenere è quello di utilizzare questa query:

select id, name from Account 

che Ti darò un set di risultati di due array di lunghezza. Dovrete costruire la mappa manualmente, in questo modo:

for(Object[] row : rs) { 
    map.put(row[0], row[1]); 
} 

Si noti che questo sarà in gran parte ignorare il secondo cache di livello e ottenere tradotto in una query SQL.

0

Supponendo per il momento che Account non dispone di tutte le associazioni non pigri che sarebbero caricati, il seguente è solo il meglio che si vuole ottenere, la performance-saggio:

List<Account> accounts = (List) session.createQuery("from Account").list(); 
for (Account account : accounts) map.put(account.getID(), account.getName()); 

Questo può essere "che richiede tempo" ma non è come Hibernate può in qualche modo evitare magicamente il passaggio di ogni riga restituita in una mappa.

A differenza dell'altra risposta, questo dovrebbe beneficiare della cache di secondo livello.

2

La modalità entità predefinita di Ibernazione è EntityMode.POJO.

è possibile utilizzare la modalità entità EntityMode.MAP per recuperare l'output della query in formato Mappa.

+0

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/persistent-classes. html # persistent-classes-dynamicmodels –

0

Hiii ...

Il codice di seguito potrebbe aiutarti.

Query query = session.createQuery("select id, name from table"); 
    List results = query.list(); 

Per visualizzare i risultati come oggetti fa il lavoro:

int i; 
    int j; 
    Object object = null; 
    for (i = 0; i < results.size(); i++) { 

     System.out.println("-------"); 
     Object[] obj = (Object[]) results.get(i); 
     for (j=0;j<obj.length;j++) 
     { 
      System.out.println(obj[j]); 
     } 
     System.out.println("-------"); 

    } 

Modifica: È possibile utilizzare che i risultati gli oggetti come mappa e you'r fatto.

-1

per utilizzare il nome dell'entità predefinita è possibile applicare il nome dell'entità al file hbm.xml.

per l'Esempio

utilizza questo, hibernate dare la coppia chiave/valore che indica ritorno mappa.

Problemi correlati