JPA entityManager.createNativeQuery()執行原生的SQL,當咱們查詢結果沒有對應的實體類時,query.getResultList()返回的是一個List<Object[]>,也就是說每行的數據被做爲一個對象數組返回。常見的用法是這樣的:java
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對象的。spa
在實際應用過程當中咱們能夠這樣實現:hibernate
1.Hibernate :code
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.OpenJPAorm
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 }