使用节点<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了。
[NHibernate]存储过程的使用(三)
最新推荐文章于 2021-04-04 10:55:59 发布