天天看點

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     }