hibernate sql 查詢

Hibernate 支持使用原生的SQL查詢,使用原生SQL查詢能夠利用某些數據庫特性,原生SQL查詢也支持將SQL語句放在配置文件中配置,從而提升程序的解耦,命名SQL查詢還能夠用於調用存儲過程。sql

SQL查詢是經過SQLQuery接口來表示的,SQLQuery接口是Query接口的子接口,徹底可使用Query接口的方法,SQLQuery增長了二個重載方法數據庫

  • addEntity():將查詢到的記錄與特定的實體關聯
  • addScalar():將查詢的記錄關聯標量值

執行SQL的步驟以下:測試

  • 獲取Hibernate Session對象
  • 編寫SQL語句
  • 建立SQLQuery對象,調用Session的createSQLQuery方法建立
  • 調用SQLQuery對象的 addScalar 或者 addEntity 方法將選出的結果與變量值或實體進行關聯
  • 若是SQL語句包含參數,則調用Query的setXxx方法爲參數賦值
  • 調用Query的list、uniqueResult方法返回查詢的結果集hibernate

       

  1. 標量查詢debug

    若是但願僅僅讓Hibernate選出某個字段的值,則可使用標量查詢,經過addScalar方法指定返回的字段值,示例以下:日誌

    List list = curSession.createSQLQuery("select * FROM OneToMany_One")對象

    .addScalar("Total_Trade_Amt", StandardBasicTypes.LONG)索引

    .list();接口

  2. 實體查詢it

    若是查詢了某個數據表的所有數據列,且該數據表有對應的持久化類映射,能夠經過 addEntity 指定持久化類型,將查詢結果轉換爲實體,示例以下:

    List list = curSession.createSQLQuery("select * FROM OneToMany_One")

    .addEntity(OneToManyForOneModel.class)

    .list();

  3. 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();

  1. 存儲過程

    Hibernate 當前僅支持存儲過程返回標量和實體,調用存儲過程還有以下需求注意的地方:

  • 建議採用標準SQL92語法,如{?=call functionName(<parameters>)} 或 {call procedureName(<parameters>)},不支持原生的調用語法。
  • 調用存儲過程進的查詢沒法使用setFirstResult()、setMaxResults()進行分頁
  1. 定製化SQL,Hibernate 須要保存、更新和刪除持久化實體時,默認經過一套固定的SQL語句來完成這些功能,若是程序須要改變這套默認的SQL語句,就可使用Hibernate所提供的定製SQL功能,

    1. 註解 @SQLInsert 定製插入記錄的SQL語句;
    2. 註解 @SQLUpdate:定製更新記錄的SQL語句;
    3. 註解 @SQLDelete:定製刪除記錄的SQL語句;
    4. 註解 @SQLDeleteAll:定製刪除全部記錄的SQL語句;
    5. 註解@Loader:定製查詢的SQL語句

    他們都有二個參數,其參數sql 表示執行的定製SQL語句(存儲過程),參數 callable 表示該語句是否爲存儲過程。若是使用存儲過程時,參數的順序很重要,能夠將 org.hibernate.persister.entity 日誌級別設置爲 debug級別,從而容許查看Hibernate所期待的順序,整個級別下,Hibernate將會輸出 create、update和delete實體的靜態SQL。由於Hibernate 會檢查SQL語句是否執行成功,因此應該讓存儲過程能返回該存儲過程影響的記錄行數,Hibernate一般把CUD操做語句的第一個參數註冊爲數值型輸出參數,因此應該讓存儲過程的第一個參數記錄該存儲過程所影響的記錄條數(存儲過程沒有測試成功)

相關文章
相關標籤/搜索