Hibernate 支持使用原生的SQL查詢,使用原生SQL查詢能夠利用某些數據庫特性,原生SQL查詢也支持將SQL語句放在配置文件中配置,從而提升程序的解耦,命名SQL查詢還能夠用於調用存儲過程。sql
SQL查詢是經過SQLQuery接口來表示的,SQLQuery接口是Query接口的子接口,徹底可使用Query接口的方法,SQLQuery增長了二個重載方法數據庫
執行SQL的步驟以下:測試
調用Query的list、uniqueResult方法返回查詢的結果集hibernate
標量查詢debug
若是但願僅僅讓Hibernate選出某個字段的值,則可使用標量查詢,經過addScalar方法指定返回的字段值,示例以下:日誌
List list = curSession.createSQLQuery("select * FROM OneToMany_One")對象
.addScalar("Total_Trade_Amt", StandardBasicTypes.LONG)索引
.list();接口
實體查詢it
若是查詢了某個數據表的所有數據列,且該數據表有對應的持久化類映射,能夠經過 addEntity 指定持久化類型,將查詢結果轉換爲實體,示例以下:
List list = curSession.createSQLQuery("select * FROM OneToMany_One")
.addEntity(OneToManyForOneModel.class)
.list();
SQL參數
SQL語句可使用二種參數定義方式,參數Key和參數索引的方式
參數Key方式:在SQL語句中使用":參數名稱"的方式定義參數,並使用 setParameter方法的參數名稱來給參數賦值,並制定參數的類型,示例以下:
List list = curSession.createSQLQuery("select * FROM OneToMany_One WHERE Record_ID = :reocrdId")
.addEntity(OneToManyForOneModel.class)
.setParameter("reocrdId", 1234, StandardBasicTypes.INTEGER)
.list();
參數索引方式:在SQL語句中使用"?"來定義參數,並使用setParameter方法的索引重載來給參數賦值,並制定參數的類型,示例以下:
List list = curSession.createSQLQuery("select * FROM OneToMany_One WHERE Record_ID = ?")
.addEntity(OneToManyForOneModel.class)
.setParameter(0, 1234, StandardBasicTypes.INTEGER)
.list();
存儲過程
Hibernate 當前僅支持存儲過程返回標量和實體,調用存儲過程還有以下需求注意的地方:
定製化SQL,Hibernate 須要保存、更新和刪除持久化實體時,默認經過一套固定的SQL語句來完成這些功能,若是程序須要改變這套默認的SQL語句,就可使用Hibernate所提供的定製SQL功能,
他們都有二個參數,其參數sql 表示執行的定製SQL語句(存儲過程),參數 callable 表示該語句是否爲存儲過程。若是使用存儲過程時,參數的順序很重要,能夠將 org.hibernate.persister.entity 日誌級別設置爲 debug級別,從而容許查看Hibernate所期待的順序,整個級別下,Hibernate將會輸出 create、update和delete實體的靜態SQL。由於Hibernate 會檢查SQL語句是否執行成功,因此應該讓存儲過程能返回該存儲過程影響的記錄行數,Hibernate一般把CUD操做語句的第一個參數註冊爲數值型輸出參數,因此應該讓存儲過程的第一個參數記錄該存儲過程所影響的記錄條數(存儲過程沒有測試成功)