使用Hibernate SQLQuery執行原生SQL

Hibernate對原生SQL查詢的支持和控制是通過SQLQuery接口實現的。通過Session接口,我們能夠很方便的創建一個SQLQuery(SQLQuery是一個接口,在Hibernate4.2.2之前,默認返回的是SQLQuery的實現類——SQLQueryImpl對象,在下文中出現的SQLQuery如非註明,都是指該子類)對象來進行原生SQL查詢:

session.createSQLQuery(String sql);
SQLQuery實現了Query接口,因此你可以使用Query接口中提供的API來獲取數據。

最簡單的示例
//獲取所有查詢結果
session.createSQLQuery(“select * from note”).list();
//僅獲取第一條結果
session.createSQLQuery(“select * from note where id = 1”).uniqueResult();
使用預處理SQL
預處理SQL的好處自然不必多說,除了衆所周知的能夠防止SQL注入攻擊外,還能夠在一定程度上提高SQL的查詢效率。SQLQuery提供了衆多的接口來分別設置不同類型的參數,諸如setBigDecimal、setBinary、setDouble等,詳參SQLQuery的JavaDoc,此處不再贅述。這裏僅重點說一下通用的SQL參數設置接口setParameter。

如下代碼示範瞭如何使用SQLQuery執行預處理SQL:

SQLQuery query = session.createSQLQuery(“select * from note where id = ?”);
//設置第一個參數的值爲12,即查詢ID=12的note
query.setParameter(0, 12);
List list = query.list();

這裏需要註明一點, 無論是通過不同類型參數的設置接口來設置SQL參數,還是通過setParameter來設置參數,下標都是從0開始的,而不是從1開始的 !

使用自定義的結果轉換器處理查詢結果
SQLQuery接口預留了setResultTransformer接口以實現使用用戶自定義的ResultTransformer結果集轉換器處理查詢結果。ResultTransformer接口非常簡單,只有兩個方法,分別用來轉換單行數據和所有結果數據。經過自定義ResultTransformer生成的實體,並未加入Session,因此是非受管實體。

如下代碼,示範瞭如何將單行數據裝入LinkedHashMap對象中:

query.setResultTransformer(new ResultTransformer() {

@Override
public Object transformTuple(Object[] values, String[] columns) {
Map

發佈了70 篇原創文章 · 獲贊 20 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章