jpa native

Resultados de la consulta nativa JPA 2.0 como mapa



native (3)

Ejecuto una consulta nativa JPA 2.0 como esta:

Query query = em.createNativeQuery("SELECT NAME, SURNAME, AGE FROM PERSON"); List list = query.getResultList();

ahora la list tiene todas las filas devueltas por la consulta. Puedo iterar sobre ellos, pero cada entrada es un Object[] donde:

  • en el índice 0 encuentro NOMBRE
  • en el índice 1 encuentro APELLIDO
  • en el índice 3 encuentro EDAD

Alguien encontró una manera de hacer algo como esto:

Map<String, Object> row = list.get(index); String name = row.get("NAME"); String surname = row.get("SURNAME"); Integer age = row.get("AGE");

Necesitaría esto ya que la consulta nativa que ejecuto es dinámica y no sé el orden del campo en la cláusula SELECT, por lo que no sé, la consulta se verá así:

SELECT SURNAME, NAME, AGE FROM PERSON

o

SELECT AGE, NAME, SURNAME FROM PERSON

o incluso

SELECT AGE, SURNAME, NAME FROM PERSON


¿Qué JPA está utilizando - Hibernate, EclipseLink o algo más?

No hay una manera estándar de hacer esto en JPA pero su implementación específica puede permitirlo, por ejemplo, Eclipselink tiene una sugerencia de tipo de resultado de consulta.

http://dev.eclipse.org/mhonarc/lists/eclipselink-users/msg03013.html

Query query = entityManager.createNativeQuery(sql); query.setHint(QueryHints.RESULT_TYPE, ResultType.Map);

Para Hibernate, con javax.persistence.Query dbQuery:

org.hibernate.Query hibernateQuery =((org.hibernate.jpa.HibernateQuery)dbQuery) .getHibernateQuery(); hibernateQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);


Como ya se mencionó, JPA anterior no lo admite, sin embargo, tengo una solución alternativa con Postgres 9.4 en mi situación, mientras trabajo con Jackson ,

List<String> list = em.createNativeQuery("select cast(json_object_agg(c.config_key,c.config_value) as text) from myschema.configuration c") .getResultList();

Para usarlo en la capa Bean, utilice el método de abajo, de lo contrario, vuelva directamente.

//handle exception here, this is just sample Map map = new ObjectMapper().readValue(list.get(0), Map.class);

Algunas funciones json más, https://www.postgresql.org/docs/9.4/static/functions-json.html . Estoy seguro de que puedes encontrar lo mismo para otras bases de datos.


Eche un vistazo a esto. Cuando estaba trabajando en el proyecto, entendí que no podía usar todas las características de JPA, así que probé el método jdbc tradicional aunque no lo recomendaría pero está funcionando para mí.

@LocalBean public class TCotisationEJB { @PersistenceContext(unitName="ClaimsProjectPU") private EntityManager em; @TransactionAttribute(TransactionAttributeType.NEVER) public List getCotisation(){ Query query=em.createNativeQuery("select Annee,Mois,RetSonarwa from TCotisMIFOTRA2008 where matricule=''10000493'' order by Annee"); List<Object[]> cotisation=query.getResultList(); Object[] cotisationData; for(int i=0;i<cotisation.size();i++){ cotisationData=cotisation.get(i); System.out.print("Annee: "+cotisationData[0]+" Mois :"+cotisationData[1]+" Amount :"+cotisationData[2]+"/n"); } return query.getResultList(); } }