JPA 2.0本机查询结果为map

时间:2011-09-29 09:36:30

标签: jpa native

我运行这样的JPA 2.0原生查询:

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

现在list包含查询返回的所有行。我可以迭代它们,但每个条目都是Object[],其中:

  
      
  • 在索引0我找到NAME
  •   
  • 在索引1处找到SURNAME
  •   
  • 在索引3处找到AGE
  •   

有没有人找到办法做这样的事情:

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

3 个答案:

答案 0 :(得分:15)

您使用的是哪种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);

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

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

答案 1 :(得分: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();
     }    
}

答案 2 :(得分:2)

正如其他已经提到的那样,较旧的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();

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

//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。我相信你可以找到其他数据库。