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 }