2011-09-29 2 views
16

j'exécuter une requête native JPA 2.0 comme ceci:JPA 2.0 résultats de la requête native comme carte

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

maintenant list a toutes les lignes renvoyées par la requête. Je peux itérer sur eux, mais chaque entrée est un Object[] où:

  • à l'index 0 Je trouve NOM
  • à l'index 1 Je trouve PRÉNOM
  • à l'index 3 Je trouve AGE

quelqu'un at-il trouvé un moyen de faire quelque chose comme ceci:

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

je aurais besoin ce depuis la requête native que j'Execute une dynamique et je ne sais pas à l'ordre du champ dans la clause SELECT, donc je ne sais pas id la requête ressemblera:

SELECT SURNAME, NAME, AGE FROM PERSON 

ou

SELECT AGE, NAME, SURNAME FROM PERSON 

ou même

SELECT AGE, SURNAME, NAME FROM PERSON 
+0

recherche de critères? http://www.ibm.com/developerworks/java/library/j-typesafejpa/ – NimChimpsky

+0

Je ne pense pas, parce que j'aurais toujours besoin de Person.class. Comme je l'ai dit, la qeury SQL est dynamique et je ne sais pas à quoi cela ressemblera. – kovica

Répondre

10

Quelle JPA utilisez-vous - Mise en veille prolongée, EclipseLink ou autre chose?

Il n'existe aucun moyen standard de faire cela dans JPA mais votre implémentation spécifique peut le permettre - par exemple, Eclipselink a un indicateur de type de résultat de requête.

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

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

Pour Hibernate, avec javax.persistence.Query dbquery:

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

il veille prolongée semble ne pas une telle indication :( – chrismarx

+2

Il travaille pour moi en utilisant requête native comme ceci: ' NativeQueryImpl nativeQuery = (NativeQueryImpl) requête,' ' nativeQuery.setResultTransformer (AliasToEntityMapResultTransformer.INSTANCE)' 'Liste > result = query.getResultList(); ' ' Mappe row = result.get (0); ' Valeur de chaîne = (Chaîne) row.get (" NAME ") ; –

2

Jetez un oeil sur ce que je l'ai eu en travaillant sur le projet que je ne pouvais pas utiliser toutes les fonctionnalités JPA J'ai donc essayé la méthode traditionnelle jdbc même si je ne la recommande pas mais ça marche pour moi.

@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

C'est exactement ce que l'OP veut changer. – bargoras

1

Comme d'autres déjà mentionné, plus JPA ne supporte pas, mais j'ai solution de contournement avec Postgres 9.4 dans ma situation, tout en travaillant avec Jackson,

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

Pour l'utiliser dans l'utilisation de la couche Bean ci-dessous méthode, sinon retourner directement.

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

Encore plus de fonctions json, https://www.postgresql.org/docs/9.4/static/functions-json.html. Je suis sûr que vous pouvez trouver la même chose pour d'autres bases de données.