cómo devolver Map con HQL

tengo una mesa

Permiso :

  • carné de identidad
  • nombre
  • desc

Lo que estoy haciendo ahora es hacer una consulta que devuelva un objeto de permiso y luego poner los valores en el mapa mediante progtwigción

1- Pero me preguntaba si es posible hacer un HQL (o sql nativo si no es posible) para seleccionar el permission_id , permission_name y devolverlos en un mapa.

2- ¿Es posible devolver el mapa en una relación de uno a muchos en lugar de seguir la lista o establecer

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") }) private List permissions = new ArrayList(0); 

es posible tener algo como:

 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") }) private Map permissions = new ArrayList(0); 

donde las dos cadenas son permission_id , permission_name .

  1. Use la select new map syntax del select new map en HQL para obtener los resultados de cada fila en un Map . Eche un vistazo a la siguiente pregunta, que resuelve el problema: cómo recuperar el resultado de la consulta de hibernación como una matriz asociativa de lista o hashmap . Por ejemplo, el siguiente HQL: select new map(perm.id as pid, perm.name as pname) from Permission perm devolverá una List de Map s, cada una con las claves “pid” y “pname”.

  2. No es posible asignar una asociación a un Map . Es posible asignar la clave del Mapa a una columna con la anotación @MapKeyColumn en la asociación. Consulte esta pregunta, que también aborda el problema, por ejemplo: JPA 2.0 Hibernate @ OneToMany + @MapKeyJoinColumn . Aquí hay otro ejemplo.

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") }) @MapKeyColumn(name="permission_id") private Map permissions = new HashMap(0);
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinTable(name = "perm_cat_map", joinColumns = { @JoinColumn(name = "perm_cat_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") }) @MapKeyColumn(name="permission_id") private Map permissions = new HashMap(0); 

prueba así,

 Session session = sessionFactory.getCurrentSession(); String HQL_QUERY = "select new map(user.id as id, user.firstName as fullName) from User user"; List> usersList = session.createQuery(HQL_QUERY).list(); 

1- Pero me preguntaba si es posible hacer un HQL (o sql nativo si no es posible) para seleccionar el permission_id, permission_name y devolverlos en un mapa.

es posible con Resulttransformer

 String queryString="select id, name from Permission "; List> permission= session.createQuery(queryString) .setResultTransformer(Transformers.TO_LIST).list(); //now you just expect two columns HashMap map= new HashMap(); for(List x: permission){ map.put((Integer)x.get(0),(String)x.get(1)) } 

En JPA 2.0 (que es compatible con versiones recientes de Hibernate), puede mapear colecciones de primitivas usando una anotación @ElementCollection .

Para ver ejemplos de dichas asignaciones, consulte los documentos de colecciones de hibernación .

Si no está realmente mapeándolo de esta manera, pero desea crear un mapa utilizando HQL o una consulta Criteria, puede crear un ResultTransformer para crear un mapa a partir del conjunto de resultados devuelto.

A juzgar por la respuesta de Xavi, creo que también hay soporte en HQL para crear un mapa sin usar un transformador.

 String sqlQuery="select userId,name,dob from user" 

Pase la consulta al siguiente método.

 public List> getDataListBySQL(final String sql, final Long adId){ List> list=(List>)getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException,SQLException { Query query=session.createSQLQuery(sql); query.setParameter("adId", adId); return query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list(); } }); return list; } Iterate this list in this way- for(int i=0;i map=list.get(i); System.out.println(map.get("userId")); System.out.println(map.get("name")); }