1. 程式人生 > >坑之 Jpa 執行原生SQL 返回對映為物件

坑之 Jpa 執行原生SQL 返回對映為物件

當使用jpa執行查詢時,因為業務上的需求,執行復雜的sql操作。

但是query.getResultList()返回的是一個List。也就是說每行的資料被作為一個物件陣列返回。

Query produceOrderList = jpa.createNativeQuery(
"select DATE_FORMAT(addTime,'%Y-%m-%d') as time,  count(id) as number from iskyshop_newwsordermessage  "
+ "where store_name ='" + store.getStore_name() + "' and addTime between" + " '" + beginDay
+ "' and '" + endDay + "' group by time "

,SatatsticsVo.calss);

這樣用會使程式碼非常不容易讓人理解, 返回的資料到底是什麼, 不去數資料庫是不知道的,而且一旦查詢語句被調整,Java程式碼也要一起調整。這時候我們想如果返回的是Map的話,用起來會清晰的多。

可惜的是JPA的API中並沒有提供這樣的設定。其實很多JPA的底層實現都是支援返回Map物件的。例如:
EclipseLink的query.setHint(QueryHints.RESULT_TYPE, ResultType.Map); 
Hibernate的.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);


當然在jpa裡也有犧牲效能來實現:

Query produceOrderList = jpa.createNativeQuery(
"select DATE_FORMAT(addTime,'%Y-%m-%d') as time,  count(id) as number from iskyshop_newwsordermessage  "
+ "where store_name ='" + store.getStore_name() + "' and addTime between" + " '" + beginDay
+ "' and '" + endDay + "' group by time "

);

        produceOrderList.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(StatisticsVo.class));