JPA2.0本机查询结果作为映射

JPA2.0本机查询结果作为映射,jpa,native,Jpa,Native,我运行JPA 2.0本机查询,如下所示: Query query = em.createNativeQuery("SELECT NAME, SURNAME, AGE FROM PERSON"); List list = query.getResultList(); Map<String, Object> row = list.get(index); String name = row.get("NAME"); String surname = row.get("SURNAME");

我运行JPA 2.0本机查询,如下所示:

Query query = em.createNativeQuery("SELECT NAME, SURNAME, AGE FROM PERSON");
List list = query.getResultList();
Map<String, Object> row = list.get(index);
String name = row.get("NAME");
String surname = row.get("SURNAME");
Integer age = row.get("AGE");
现在,
list
拥有查询返回的所有行。我可以对它们进行迭代,但每个条目都是一个
对象[]
,其中:

  • 在索引0处,我找到了NAME
  • 在索引1中我找到了姓氏
  • 在指数3,我找到了年龄
有没有人找到这样做的方法:

Query query = em.createNativeQuery("SELECT NAME, SURNAME, AGE FROM PERSON");
List list = query.getResultList();
Map<String, Object> row = list.get(index);
String name = row.get("NAME");
String surname = row.get("SURNAME");
Integer age = row.get("AGE");

甚至

SELECT AGE, SURNAME, NAME FROM PERSON

您使用的JPA是Hibernate、EclipseLink还是其他什么

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

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

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

看看这个,当我在项目中工作时,我发现我不能使用所有的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();
     }    
}
@LocalBean
公共类tcotationejb{
@PersistenceContext(unitName=“ClaimsProjectPU”)
私人实体管理者;
@TransactionAttribute(TransactionAttribute.NEVER)
公共列表getCotization(){
Query Query=em.createNativeQuery(“从TCotisMIFOTRA2008中选择Annee、Mois、Retsonawa,其中matricule='10000493'按Annee排序”);
列表编码=query.getResultList();
对象[]cotisationData;

对于(int i=0;i,正如前面提到的,较旧的
JPA
不支持它,但是我在与
Jackson
一起工作时,在我的情况下,有了
Postgres 9.4
的变通解决方案

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

还有一些json函数。我相信您可以在其他数据库中找到相同的函数。

条件查询?我不这么认为,因为我仍然需要Person.class。正如我所说的,SQL qeury是动态的,我实际上不知道它会是什么样子。hibernate似乎没有这样的提示:(对我来说,使用本机查询是这样的:
NativeQueryImpl nativeQuery=(NativeQueryImpl)查询;
nativeQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
列表结果=query.getResultList();
映射行=result.get(0);
字符串值=(String)行.get(“名称”);方法setResultTransformer()已被弃用,因为Hibernate 5.2这正是OP想要更改的。
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);