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