2011-09-29 15 views
16

que ejecutar una consulta nativa JPA 2.0 así:JPA 2.0 nativos resultados de la consulta como un mapa

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

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

  • en el índice 0 Me encontrar el nombre
  • en el índice 1 Encuentro APELLIDOS
  • 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"); 

que necesitaría esto ya que la consulta nativa que ejecuto es dinámico y no sé el orden del campo en la cláusula SELECT, por lo que no sé Identificación de 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 
+0

criterios consulta? http://www.ibm.com/developerworks/java/library/j-typesafejpa/ – NimChimpsky

+0

No lo creo, porque aún necesitaría Person.class. Como dije, el qeury de SQL es dinámico y en realidad no sé cómo se verá. – kovica

Respuesta

10

Qué APP está usando - Hibernate, EclipseLink o alguna otra cosa?

No hay una forma 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); 
+2

parece hibernación no tiene una pizca tales :( – chrismarx

+2

Se está trabajando para mí el uso de consulta nativa de esta manera: ' NativeQueryImpl nativeQuery = (NativeQueryImpl) consulta;' ' nativeQuery.setResultTransformer (AliasToEntityMapResultTransformer.INSTANCE);' 'Lista > result = query.getResultList(); ' ' Map row = result.get (0); ' String value = (String) row.get (" NAME ") ; –

2

echar un vistazo a esto lo tengo cuando se trabaja en un proyecto que no podía usar todas las funciones de la APP así que probé el método jdbc tradicional incluso si 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(); 
    }  
} 
+1

Esto es exactamente lo que OP quiere cambiar. – bargoras

1

Como otros ya se ha mencionado, mayores JPA no lo soporte, sin embargo tengo solución solución con Postgres 9.4 en mi situación, mientras se trabaja 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(); 

usarlo en grano de utilización capa debajo método, de lo contrario regresará directamente.

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

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

Cuestiones relacionadas