JPA EntityManager 在没有实体类的情况下返回Map
Posted wynn-ni
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA EntityManager 在没有实体类的情况下返回Map相关的知识,希望对你有一定的参考价值。
JPA entityManager.createNativeQuery()执行原生的SQL,当我们查询结果没有对应的实体类时,query.getResultList()返回的是一个List<Object[]>,也就是说每行的数据被作为一个对象数组返回。常见的用法是这样的:
1 public void testNativeQuery(){ 2 Query query = entityManager.createNativeQuery("select id, code,name from table1 "); 3 List<Object[]> rows = query.getResultList(); 4 for (Object[] row : rows) { 5 System.out.println("id = " + row[0]+";code = " + row[1]+";name= " + row[2]); 6 } 7 }
这样的返回值常常让我们不知道其对应关系,尤其是在执行select *的过程中。
其实很多JPA的底层实现都是支持返回Map对象的。
在实际应用过程中我们可以这样实现:
1.Hibernate :
1 public void testNativeQuery() { 2 Query q = entityManager.createNativeQuery("select * from table1"); 3 // 将结果转化为 Map<key, value> 4 q.unwrap(org.hibernate.SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); 5 List<Map<String, Object>> list = q.getResultList(); 6 for (Map<String, Object> m : list) { 7 System.out.println(m); 8 } 9 }
2.OpenJPA
1 public void testNativeQuery() { 2 EntityManager entityManager = SpringUtil.getBean(EntityManager.class); 3 Query q = entityManager.createNativeQuery("select * from table1"); 4 QueryImpl impl = q.unwrap(QueryImpl.class); 5 impl.setResultTransformer(Map.class); 6 List list = q.getResultList(); 7 for (Map m : list) { 8 System.out.println(m); 9 } 10 }
3.最简单的方法
1 public void testNativeQuery() { 2 EntityManager entityManager = SpringUtil.getBean(EntityManager.class); 3 Query q = entityManager.createNativeQuery("select * from table1",java.util.Map.class); 4 List<Map<String, Object>> list = q.getResultList(); 5 for (Map m : list) { 6 System.out.println(m); 7 } 8 }
以上是关于JPA EntityManager 在没有实体类的情况下返回Map的主要内容,如果未能解决你的问题,请参考以下文章
创建没有 persistence.xml 配置文件的 JPA EntityManager
Spring Boot-------JPA——EntityManager构建通用DAO
Spring Data JPA 中使用Update Query更新实体类问题