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 }