2011-09-29 116 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。我相信你可以找到相同的其他数据库。