Hibernate3允許你使用手寫的sql來完成所有的create,update,delete,和load操作(包括存儲過程)
使用存儲過程來查詢
Hibernate 3引入了對存儲過程查詢的支持. 存儲過程必須返回一個結果集,作為Hibernate能夠使用的第一個外部參數. 下面是一個Oracle9和更高版本的存儲過程例子.
CREATE OR REPLACE FUNCTION selectAllEmployments
RETURN SYS_REFCURSOR
AS
st_cursor SYS_REFCURSOR;
BEGIN
OPEN st_cursor FOR
SELECT EMPLOYEE, EMPLOYER,
STARTDATE, ENDDATE,
REGIONCODE, EID, VALUE, CURRENCY
FROM EMPLOYMENT;
RETURN st_cursor;
END;
在Hibernate里要要使用這個查詢,你需要通過命名查詢來映射它.
<sql-query name="selectAllEmployees_SP" callable="true">
<return alias="emp" class="Employment">
<return-property name="employee" column="EMPLOYEE"/>
<return-property name="employer" column="EMPLOYER"/>
<return-property name="startDate" column="STARTDATE"/>
<return-property name="endDate" column="ENDDATE"/>
<return-property name="regionCode" column="REGIONCODE"/>
<return-property name="id" column="EID"/>
<return-property name="salary">
<return-column name="VALUE"/>
<return-column name="CURRENCY"/>
</return-property>
</return>
{ ? = call selectAllEmployments() }
</sql-query>
{ ? = call selectAllUsers() } 也可以寫成{ call selectAllUsers() },
如果有參數就寫成
{ ? = call selectAllUsers(?,?,?) }
代碼中對query設置相應位置上的值就OK
Java調用關鍵代碼如下
Session session = HibernateUtil.currentSession();
Query query = session.getNamedQuery("selectAllUsers");
List list = query.list();
System.out.println(list);
要求你的存儲過程必須能返回記錄集,否則要出錯
如果你的存儲過程是完成非查詢任務就應該在配置文件用以下三個標簽
<sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>
<sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>
<sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>
注意存儲過程當前僅僅返回標量和實體.現在不支持<return-join>和<load-collection>
使用存儲過程的規則和限制
為了在Hibernate中使用存儲過程,你必須遵循一些規則.不遵循這些規則的存儲過程將不可用.如果你仍然想要使用他們, 你必須通過session.connection()來執行他們.這些規則針對于不同的數據庫.因為數據庫 提供商有各種不同的存儲過程語法和語義.
對存儲過程進行的查詢無法使用setFirstResult()/setMaxResults()進行分頁。
對于Oracle有如下規則:
存儲過程必須返回一個結果集.它通過返回SYS_REFCURSOR實現(在Oracle9或10),在Oracle里你需要定義一個REF CURSOR 類型
推薦的格式是 { ? = call procName(<parameters>) } 或 { ? = call procName }(這更像是Oracle規則而不是Hibernate規則)
對于Sybase或者MS SQL server有如下規則:
存儲過程必須返回一個結果集。.注意這些servers可能返回多個結果集以及更新的數目.Hibernate將取出第一條結果集作為它的返回值, 其他將被丟棄。
如果你能夠在存儲過程里設定SET NOCOUNT ON,這可能會效率更高,但這不是必需的。
posted on 2007-05-18 08:50
李大嘴 閱讀(2567)
評論(0) 編輯 收藏