JPA2.0本机查询结果作为映射
我运行JPA 2.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");
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);