[NHibernate]存储过程的使用(三)

目录

写在前面html

文档与系列文章sql

查询缓存

总结session

写在前面

前面的文章介绍了在nhibernate中使用存储过程进行增删改的操做,固然查询也是能够的,在nhibernate中也能够执行任意的存储过程。本篇文章将介绍如何使用查询的存储过程的方式。并发

文档与系列文章

[Nhibernate]体系结构app

[NHibernate]ISessionFactory配置ide

[NHibernate]持久化类(Persistent Classes)sqlserver

[NHibernate]O/R Mapping基础post

[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

相关文章
相关标签/搜索