2011-09-29 70 views
16

我運行一個JPA 2.0原生查詢是這樣的:JPA 2.0原生查詢結果作爲地圖

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

現在list具有由查詢返回的所有行。我可以遍歷他們,但每個條目是一個Object[]其中:

  • 在索引0我覺得NAME
  • 在索引1,我覺得SURNAME
  • 在指數3,我覺得年齡

沒有人找到一種方法,做這樣的事情:

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

我需要這個,因爲我執行是一個動態的,我不知道在SELECT子句中的字段順序本地查詢,所以我不知道ID查詢將看起來像:

SELECT SURNAME, NAME, AGE FROM PERSON 

SELECT AGE, NAME, SURNAME FROM PERSON 

甚至

SELECT AGE, SURNAME, NAME FROM PERSON 
+0

條件查詢? http://www.ibm.com/developerworks/java/library/j-typesafejpa/ – NimChimpsky

+0

我不這麼認爲,因爲我仍然需要Person.class。正如我所說的,SQL qeury是動態的,我實際上不知道它會是什麼樣子。 – kovica

回答

10

是否使用的是JPA - Hibernate的,的EclipseLink或其他什麼東西?

在JPA中沒有這樣做的標準方法,但是您的具體實現可能允許它 - 例如,Eclipselink具有查詢結果類型提示。

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

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

對於休眠,以javax.persistence.Query的DBQuery:

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

似乎休眠沒有這樣的提示:( – chrismarx

+2

它使用本地查詢這樣的工作對我來說: 'NativeQueryImpl nativeQuery =(NativeQueryImpl)查詢;'' nativeQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);'' 名單> result = query.getResultList();' 'Map row = result.get(0);' String value =(String)row.get(「NAME」) ; –

2

看看在這個項目上,我無法使用所有的功能JPA工作時,我得到了它所以我嘗試了傳統的jdbc方法,即使我不會推薦這個,但它對我有用。

@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

這正是OP想要改變的。 – bargoras

1

如前所述等,老年JPA不支持它,但是我有我的局面Postgres 9.4變通的解決方案,同時與Jackson工作,

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

在下面豆層使用方式,因此方法,否則直接返回。

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

還有幾個json函數,https://www.postgresql.org/docs/9.4/static/functions-json.html。我相信你可以找到相同的其他數據庫。