寫在前面html
文檔與系列文章sql
查詢緩存
總結session
前面的文章介紹了在nhibernate中使用存儲過程進行增刪改的操做,固然查詢也是能夠的,在nhibernate中也能夠執行任意的存儲過程。本篇文章將介紹如何使用查詢的存儲過程的方式。併發
[NHibernate]ISessionFactory配置ide
[NHibernate]持久化類(Persistent Classes)sqlserver
[NHibernate]集合類(Collections)映射 測試
[NHibernate]緩存(NHibernate.Caches)
[NHibernate]NHibernate.Tool.hbm2net
[NHibernate]Nhibernate如何映射sqlserver中image字段
[NHibernate]條件查詢Criteria Query
使用節點<sql-query>根據用戶id進行查詢
添加存儲過程
create proc [dbo].[ps_Search] @CustomerID uniqueidentifier as begin select * from TB_Customer where CustomerID=@CustomerID end
在映射文件中使用<sql-query>並定義<sql-query>查詢的名稱
1 <!--須要和class節點同一級別--> 2 <sql-query name="ps_Search" > 3 <return class="Wolfy.Shop.Domain.Entities.Customer,Wolfy.Shop.Domain" /> 4 exec ps_Search :CustomerID 5 </sql-query>
測試
在數據訪問層中,使用ISession接口提供的GetNamedQuery方法來調用帶命名的存儲過程,並傳遞一個整形參數。代碼以下:
1 /// <summary> 2 /// 使用存儲過程,進行查詢 3 /// </summary> 4 /// <returns></returns> 5 public IList<Customer> SearchCustomerByIDUsingProc(Guid customerID) 6 { 7 ISession session = NHibernateHelper.GetSession(); 8 //參數爲映射文件中爲<sql-query>節點指定的name 9 10 return session.GetNamedQuery("ps_Search") 11 .SetGuid("CustomerID", customerID) 12 .List<Customer>(); 13 }
結果
生成的sql語句
1 exec sp_executesql N'exec ps_Search @p0',N'@p0 uniqueidentifier',@p0='DDF63750-3307-461B-B96A-7FF356540CB8'
若是就想返回一個實體的一部分屬性怎麼辦?
修改存儲過程,只選擇須要的字段
1 ALTER proc [dbo].[ps_Search] 2 @CustomerID uniqueidentifier 3 as 4 begin 5 select CustomerName from TB_Customer 6 where CustomerID=@CustomerID 7 end
修改映射文件
<!--須要和class節點同一級別--> <sql-query name="ps_Search" > <!--<return class="Wolfy.Shop.Domain.Entities.Customer,Wolfy.Shop.Domain" />--> <return-scalar column="CustomerName" type="String"/> exec ps_Search :CustomerID </sql-query>
修改方法
1 /// <summary> 2 /// 使用存儲過程,進行查詢 3 /// </summary> 4 /// <returns></returns> 5 public string SearchCustomerNameUsingProc(Guid customerID) 6 { 7 ISession session = NHibernateHelper.GetSession(); 8 //參數爲映射文件中爲<sql-query>節點指定的name 9 return session.GetNamedQuery("ps_Search") 10 .SetGuid("CustomerID", customerID).UniqueResult().ToString(); 11 }
結果
由於執行的是存儲過程,sql語句與上面相同(在原來的存儲過程基礎上修改的)。
最多見的bug
遇到這樣的異常,能夠忽視它,我找了好久也沒找到解決方案,而後就直接.List<Customer>()將結果返回了。雖然獲得結果了總有那麼點不太滿意(完美主義者)。
這篇文章介紹了nhibernate中如何使用查詢存儲過程的方法及需注意的地方,好比映射文件中<sql-query>節點需和<class>同級別才行。到這裏nhibernate中使用存儲過程增刪改查就算結束了,說個題外話,使用orm爲了少寫sql,因此在實際項目中使用nhibernate的存儲過程比較少見。就算用也沒有直接在映射文件中添加<sql-**>的方式。由於你知道,不必定別人就知道,因此形成必定的維護難度,不過知道這種高大上的寫法,遇到的時候知道咋回事就ok了。
參考文章:http://www.cnblogs.com/lyj/archive/2008/11/07/1328782.html