[NHibernate]存儲過程的使用(三)


目錄

寫在前面

文檔與系列文章

查詢

總結

寫在前面

前面的文章介紹了在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM