En JPA 2.0, podemos usar EntityManager.CreatenativeQuery () para ejecutar declaraciones SQL nativas. Pero cuando nuestro resultado de la consulta no tiene una clase de entidad correspondiente, Query.getResultList () devuelve una lista <objeto []>. Es decir, los datos de cada fila se devuelven como una matriz de objetos.
El uso común es este:
public void testNativeQuery () {Query Query = EntityManager.CreatenativeQuery ("Seleccione ID, nombre, edad de t_user"); Lista de filas = query.getResultList (); for (objeto fila: filas) {objeto [] celdas = (objeto []) fila; System.out.println ("id =" + celdas [0]); System.out.println ("name =" + celdas [1]); System.out.println ("Age =" + Cells [2]); }}De esta manera, hará que el código sea muy difícil de entender. ¿Qué es exactamente un elemento con un subíndice de 0? No se sabe si no cuenta la declaración de consulta. Además, una vez que se ajusta la declaración de consulta, el código Java también debe ajustarse juntos. En este momento, creemos que si se devuelve el mapa, será mucho más claro de usar.
Desafortunadamente, la API de JPA no proporciona dicha configuración. De hecho, muchas implementaciones de JPA subyacentes admiten objetos de mapa que devuelven.
Por ejemplo:
Query.sethint (Queryhints.result_type, resultType.map); Hibernate .SetResultTransformer (transformers.alias_to_entity_map);
Entonces, si queremos devolver el mapa y determinar que la capa subyacente está utilizando una determinada implementación de JPA, podemos dar el siguiente paso y sacrificar las características de implementación cruzada para satisfacer nuestras necesidades:
public void testNativeQuery () {Query Query = EntityManager.CreatenativeQuery ("Seleccione ID, nombre, edad de t_user"); Query.unwrap (sqlQuery.class) .setResultTransformer (transformers.alias_to_entity_map); Lista de filas = query.getResultList (); for (object obj: filas) {map row = (map) obj; System.out.println ("id =" + row.get ("id")); System.out.println ("name =" + row.get ("name")); System.out.println ("Age =" + Row.get ("Age")); }}Consulta devuelve el método de escritura del tipo de retorno de entidad especificado
Query Query = EntityManager.CreatenativeQuery ("Seleccionar ID, nombre, edad de T_user", user.class);Cabe señalar aquí que usar MAP es definitivamente menos eficiente que usar matrices de objetos. Entonces debe ver si la caída de rendimiento está dentro del rango aceptable. Luego, en mi entorno Hibernate 4.2.x, no importa si escribe letras mayúsculas o letras minúsculas en su SQL nativo, los nombres de campo devueltos están capitalizados. Por supuesto, puede procesar los nombres de campo de cierta manera personalizando el resultado de resultados e incluso devolver el POJO que necesita.
El método anterior para permitir que el objeto Map de retorno de la interfaz de consulta de consultas de JPA sea todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.