2011-01-19 15 views
10

Tengo esta tabla:Con Hibernate, ¿cómo puedo consultar una tabla y devolver un hashmap con valor clave par nombre> nombre?

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

Quiero consultar esta tabla con el mecanismo de hibernación (para usar el segundo nivel de caché). El resultado de la consulta de hibernación debe ser un mapa hash donde la clave es el identificador de campo y donde el valor es el nombre del campo.

¿Cómo puedo escribirlo con HQL?

Si utilizo el mapa, solo puedo usar un alias y si uso un constructor con un objeto, debo transformar el resultado en hashmap, que consume mucho tiempo.

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

el resultado de la consulta debe ser un HashMap:

1>Jerome 
2>Steve 
3>Nick 

gracias

Respuesta

11

Esta pregunta es antigua, pero esto podría ayudar a otras personas. Ahora puede usar HQL para devolver mapas con hibernación. usar algo como esto:

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

a partir de documentos de hibernación: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-select

+4

alrededor de 1 año 1/2, ¡actualizo mi respuesta aceptada! Esto fue exactamente lo que busqué. ¡Esto es un poco tarde pero una información útil! –

5

creo que lo más cerca que puede obtener es el uso de esta consulta:

select id, name from Account 

cuales Te daré un conjunto de resultados de dos matrices de longitud. Vas a tener que construir el mapa de forma manual, así:

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

Tenga en cuenta que este no hará caso de gran parte de la caché de segundo nivel y se traducen en una consulta SQL.

0

Suponiendo por el momento que la cuenta no tiene todas las asociaciones no perezosos que pueden cargar, lo que sigue es simplemente lo mejor que vas a conseguir, en cuanto al rendimiento:

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

Esto puede "consuma mucho tiempo", pero no es como si Hibernate pudiera evitar mágicamente el paso de poner cada fila devuelta en un mapa.

A diferencia de la otra respuesta, esto debería beneficiarse de la memoria caché de segundo nivel.

2

El modo de entidad predeterminado de Hibernate es EntityMode.POJO.

puede usar el modo de entidad EntityMode.MAP para recuperar el resultado de la consulta en formato Map.

+0

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

0

Hiii ...

A continuación código podría ayudarle.

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

para mostrar los resultados como objetos hace el trabajo:

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("-------"); 

    } 

Editar: Puede utilizar objetos que resulta tan mapa y you'r hecho.

-1

intead de utilizar el nombre de entidad predeterminado puede aplicar el nombre de entidad al archivo hbm.xml.

para el Ejemplo

el uso de este, hibernación dar el par clave/valor que medios de retorno el mapa.

Cuestiones relacionadas