在使用Hibernate的使用中,對報表的數據處理經常需要寫原生的SQL,但使用默認的Hibernate中的List方法只能返回值數組對象,這給以後的修改和維護帶來很多的不便。
其實我們可以通過擴展Hibernate讓結果封裝爲指定的對象結果集,這樣即使用原生SQL,也可能以優雅的方式來處理返回的結果。
Hibernate中有一系列用於組裝返回值對象的工具類,這些類位於Package:org.hibernate.transform中,當Hibernate查詢後會通過這些Transform來重新組裝原始的返回結果,我們只需要自定義一個這樣的Transform,然後在查詢時把這個Transform傳遞給Hibernate的查詢方法,即可把我們指定的方法來重新組裝查詢結果。
爲了實現這個功能,我們需要實現org.hibernate.transform.ResultTransformer這個接口。
接口包括兩個方法:
transformTuple方法參數說明:
1: 值列表。原始SQL查詢後的返回值數組。
2: 列別名列表。原始SQL查詢結果返回的列名(這個需要注意,Oracle等DB可能不區分大小寫,所以在通過列名反射取得對象類的Set方法前,如果需要按駝峯式的命名法,需要自己制定別名規則)。
transformList方法一般直接返回參數List。
上面參考代碼中使用field_name作爲別名規則,這樣在返回對象定義時,可以定義屬性爲fieldName,相應的Set方法名爲SetFieldName。
** 需要注意的是, 這種方法需要返回的對象類屬性類型定義需要和DB返回的相應字段類型兼容。