首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JPA2.0原生查询结果为map

JPA2.0原生查询结果为map
EN

Stack Overflow用户
提问于 2011-09-29 17:36:30
回答 3查看 62.6K关注 0票数 24

我运行JPA2.0原生查询,如下所示:

代码语言:javascript
复制
Query query = em.createNativeQuery("SELECT NAME, SURNAME, AGE FROM PERSON");
List list = query.getResultList();

现在,list拥有查询返回的所有行。我可以遍历它们,但每个条目都是一个Object[],其中:

  • 在索引0上我在索引1上找到了
  • 我在索引3上找到了
  • 我在索引3上找到了

有没有人找到了这样的方法:

代码语言:javascript
复制
Map<String, Object> row = list.get(index);
String name = row.get("NAME");
String surname = row.get("SURNAME");
Integer age = row.get("AGE");

我需要它,因为我执行的原生查询是动态的,我不知道SELECT子句中字段的顺序,所以我不知道查询的id:

代码语言:javascript
复制
SELECT SURNAME, NAME, AGE FROM PERSON

代码语言:javascript
复制
SELECT AGE, NAME, SURNAME FROM PERSON

甚至是

代码语言:javascript
复制
SELECT AGE, SURNAME, NAME FROM PERSON
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-30 05:12:58

您使用的是哪种JPA - Hibernate、EclipseLink还是其他?

在JPA中没有这样做的标准方法,但是您的特定实现可能允许这样做-例如,Eclipselink有一个查询结果类型提示。

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

代码语言:javascript
复制
Query query = entityManager.createNativeQuery(sql);
query.setHint(QueryHints.RESULT_TYPE, ResultType.Map);

对于Hibernate,使用javax.persistence.Query dbQuery:

代码语言:javascript
复制
org.hibernate.Query hibernateQuery =((org.hibernate.jpa.HibernateQuery)dbQuery)
.getHibernateQuery();
hibernateQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
票数 16
EN

Stack Overflow用户

发布于 2017-09-13 14:40:28

正如其他人已经提到的,较旧的JPA不支持它,但是在我的情况下,我有一个使用Postgres 9.4的解决方案,同时使用Jackson

代码语言:javascript
复制
List<String> list = em.createNativeQuery("select cast(json_object_agg(c.config_key,c.config_value) as text) from myschema.configuration c")
                   .getResultList();

要在Bean层中使用它,请使用下面的方法,否则直接返回。

代码语言:javascript
复制
//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。我相信你可以在其他数据库中找到同样的东西。

票数 3
EN

Stack Overflow用户

发布于 2012-04-25 00:17:39

看看这个,我在做项目时发现我不能使用所有的JPA特性,所以我尝试了传统的jdbc方法,即使我不推荐这样做,但它对我来说是有效的。

代码语言:javascript
复制
@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();
     }    
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7595328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档