2011-09-29 9 views
16

Prowadzę JPA 2.0 natywną zapytanie tak:JPA 2.0 rodzime wyniki kwerendy mapie

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

teraz list ma wszystkich wierszy zwracanych przez kwerendę. Mogę iteracyjne nad nimi, ale każdy wpis jest Object[] gdzie:

  • w indeksie 0 znajdę NAZWA
  • w indeksie 1 znajdę nazwisko
  • w indeksie 3 znajdę Wiek

Czy ktoś znaleźć sposób, aby zrobić coś takiego:

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

Potrzebowałbym tego, ponieważ natywne zapytanie, które wykonuję, jest dynamiczne i nie znam kolejności pola w klauzuli SELECT, więc nie wiem, id zapytanie będzie wyglądać:

SELECT SURNAME, NAME, AGE FROM PERSON 

lub

SELECT AGE, NAME, SURNAME FROM PERSON 

lub nawet

SELECT AGE, SURNAME, NAME FROM PERSON 
+0

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

+0

Nie sądzę, żebym nadal potrzebował Person.class w tyle. Jak już powiedziałem, qeury SQL jest dynamiczne i właściwie nie wiem, jak to będzie wyglądało. – kovica

Odpowiedz

10

które JPA używasz - Hibernate, EclipseLink lub coś innego?

Nie ma standardowego sposobu wykonania tej czynności w WZP, ale może to dopuszczać konkretna implementacja - na przykład Eclipselink ma wskazówkę dotyczącą wyniku zapytania.

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

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

Dla Hibernate, z javax.persistence.Query dbQuery:

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

wydaje hibernacji nie posiada taką wskazówkę :( – chrismarx

+2

to działa dla mnie za pomocą natywnego zapytanie tak: 'NativeQueryImpl nativeQuery = (NativeQueryImpl) zapytanie;' 'nativeQuery.setResultTransformer (AliasToEntityMapResultTransformer.INSTANCE)' 'Lista > result = query.getResultList(); ' ' Map row = result.get (0); ' String value = (String) row.get (" NAME ") ; –

2

Spójrz na to mam go podczas pracy nad projektem, że nie mogę wykorzystać wszystkie funkcje WZP więc spróbowałem tradycyjnej metody jdbc, nawet jeśli nie poleciłbym tego, ale działa to dla mnie.

@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

To jest dokładnie to, co OP chce zmienić. – bargoras

1

Jako drugi już wspomniano, starszy JPA nie obsługuje jednak mam obejście rozwiązanie Postgres 9.4 w mojej sytuacji, podczas pracy z Jackson,

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

Aby użyć go w Bean stosowania warstwy poniżej metoda, w przeciwnym razie bezpośrednio zwraca.

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

Kilka innych funkcji json, https://www.postgresql.org/docs/9.4/static/functions-json.html. Jestem pewien, że możesz znaleźć to samo dla innych baz danych.

Powiązane problemy