目錄
寫在前面
文檔與系列文章
查詢
總結
前面的文章介紹了在nhibernate中使用存儲過程進行增删改的操作,當然查詢也是可以的,在nhibernate中也可以執行任意的存儲過程。本篇文章将介紹如何使用查詢的存儲過程的方式。
[Nhibernate]體系結構
[NHibernate]ISessionFactory配置
[NHibernate]持久化類(Persistent Classes)
[NHibernate]O/R Mapping基礎
[NHibernate]集合類(Collections)映射
[NHibernate]關聯映射
[NHibernate]Parent/Child
[NHibernate]緩存(NHibernate.Caches)
[NHibernate]NHibernate.Tool.hbm2net
[NHibernate]Nullables
[NHibernate]Nhibernate如何映射sqlserver中image字段
[NHibernate]基本配置與測試
[NHibernate]HQL查詢
[NHibernate]條件查詢Criteria Query
[NHibernate]增删改操作
[NHibernate]事務
[NHibernate]并發控制
[NHibernate]元件之依賴對象
[NHibernate]一對多關系(級聯删除,級聯添加)
[NHibernate]一對多關系(關聯查詢)
[NHibernate]多對多關系(關聯查詢)
[NHibernate]延遲加載
[NHibernate]立即加載
[NHibernate]視圖處理
[NHibernate]N+1 Select查詢問題分析
[NHibernate]存儲過程的使用(一)
[NHibernate]存儲過程的使用(二)
使用節點<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
-
部落格位址:http://www.cnblogs.com/wolf-sun/
部落格版權:如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!
再次感謝您耐心的讀完本篇文章。