[NHibernate]存储过程的使用(三)
目录
写在前面
前面的文章介绍了在nhibernate中使用存储过程进行增删改的操作,当然查询也是可以的,在nhibernate中也可以执行任意的存储过程。本篇文章将介绍如何使用查询的存储过程的方式。
文档与系列文章
[NHibernate]持久化类(Persistent Classes)
[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>查询的名称
<!--需要和class节点同一级别-->
<sql-query name="ps_Search" >
<return class="Wolfy.Shop.Domain.Entities.Customer,Wolfy.Shop.Domain" />
exec ps_Search :CustomerID
</sql-query>
测试
在数据访问层中,使用ISession接口提供的GetNamedQuery方法来调用带命名的存储过程,并传递一个整形参数。代码如下:
/// <summary>
/// 使用存储过程,进行查询
/// </summary>
/// <returns></returns>
public IList<Customer> SearchCustomerByIDUsingProc(Guid customerID)
{
ISession session = NHibernateHelper.GetSession();
//参数为映射文件中为<sql-query>节点指定的name return session.GetNamedQuery("ps_Search")
.SetGuid("CustomerID", customerID)
.List<Customer>();
}
结果
生成的sql语句
exec sp_executesql N'exec ps_Search @p0',N'@p0 uniqueidentifier',@p0='DDF63750-3307-461B-B96A-7FF356540CB8'
如果就想返回一个实体的一部分属性怎么办?
修改存储过程,只选择需要的字段
ALTER proc [dbo].[ps_Search]
@CustomerID uniqueidentifier
as
begin
select CustomerName from TB_Customer
where CustomerID=@CustomerID
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>
修改方法
/// <summary>
/// 使用存储过程,进行查询
/// </summary>
/// <returns></returns>
public string SearchCustomerNameUsingProc(Guid customerID)
{
ISession session = NHibernateHelper.GetSession();
//参数为映射文件中为<sql-query>节点指定的name
return session.GetNamedQuery("ps_Search")
.SetGuid("CustomerID", customerID).UniqueResult().ToString();
}
结果
因为执行的是存储过程,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
[NHibernate]存储过程的使用(三)的更多相关文章
- [NHibernate]存储过程的使用(二)
目录 写在前面 文档与系列文章 创建对象 更新对象 总结 写在前面 上篇文章介绍了如何使用MyGeneration代码生成器生成存储过程,以及nhibernate中通过存储过程删除数据的内容,这篇文章 ...
- NHibernate 映射基础(第三篇) 简单映射、联合主键
NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...
- [NHibernate]存储过程的使用(一)
目录 写在前面 文档与系列文章 Nhibernate中使用存储过程 一个例子 总结 写在前面 上篇文章一个小插曲,分析了延迟加载是如何解决N+1 select查询问题的.这篇开始介绍在nhiberna ...
- NHibernate 存储过程使用
NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DE ...
- NHibernate 存储过程 第十四篇
NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DE ...
- ERP通用存储过程封装(三)
一:解释 SQL Server提供了一种方法:可以将一些预先编译的SQL语句集中起来由SQL Server数据库服务器来完成以实现某个任务,这就是存储过程.存储过程常驻在SQL Server ...
- Nhibernate 存储过程获取返回值
写在前面:因为项目使用ssh.net所以做着做着要调用存储过程,而且是有返回值的,按照以前的做法直接在参数里指定下就可以获取,但是在nhibernate里调用就有点陌生了,百度一下得出的结果有两种:第 ...
- Nhibernate系列学习之(三) Criteria查询表达式增删改查
Criteria查询表达式: 正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制. Restrict ...
- MVC+Nhibernate+spring.net(三)
当前层次已经分好 分层架构 画的不是太好啊,后面我会上代码,大家先将就着看吧. 现在开始搭建spring 搭建spring首先引用类库文件: spring.AopSpring.Corespring.W ...
随机推荐
- Windows10 会不会成为微软的新起点?
Because if you change the way you see the world, you can change the world you see. 如果你改变看世界的方式,你就能改变 ...
- makefile之VPATH和vpath的使用
来自阅读陈皓的<跟我一起写makefile> VPATH变量 在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中.所以,当 make 需要去找寻文 ...
- 安装 Visual Studio Web Tools 的奇怪问题
安装Microsoft ASP.NET 5 RC 1 时提示 0x80070005 - 拒绝访问 日志文件为 [1968:3F64][2015-11-20T10:08:36]i010: Launchi ...
- 《InsideUE4》-7-GamePlay架构(六)PlayerController和AIController
PlayerController:你不懂,伴君如伴虎啊 AIController:上来,我自己动 引言 上文我们谈到了Component-Actor-Pawn-Controller的结构,追溯了ACo ...
- HTML 学习笔记 JavaScript (prototype)
原博地址:http://www.cnblogs.com/dolphinX/p/3286177.html 原博客的作者是一个非常牛逼的前端大神,我作为一个初学者,在此借助大神的博客进行自己的学习.在这里 ...
- android第一行代码-1.项目结构
0.项目结构 一个简单的android项目结构大致如下 入口就是MainActivity这个类,如果对于一个陌生的项目,最好的办法是看AndroidMainifest.xml,如下 <?xml ...
- ZigZag Conversion leetcode java
题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...
- c#串口通信类代码可以直接调用
文章首发于浩瀚先森博客 直接上代码 public struct SerialPara { private string portName; public string PortNameSetGet { ...
- CentOS 新增swap交换空间
在centos 6.4 64位系统中安装oracle 10g数据库软件,但由于交换空间过小导致检查不通过: 因此需要增加交换空间的大小. 第一步:在opt目录下新建swap交换文件,并设置其大小为2G ...
- Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>
Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...