[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 ...
随机推荐
- Linux--shell脚本之正则表达式
一.正则表达式的概念及特点: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑.规 ...
- 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)
构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...
- Android项目部署时,发生AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class错误
这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面. 当时,我仔细检查了一下自己的代码,并 ...
- NOIP2012 普及组 T3 摆花——S.B.S.
题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...
- BZOJ 3343: 教主的魔法 [分块]【学习笔记】
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: 526[Submit][Status][Discus ...
- 洛谷P1341 无序字母对[无向图欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- JAVA中如何使用SORT从大到小排
import java.util.Arrays;import java.util.Collections;public class Test { public static void main(Str ...
- node-sass安装不成功的解决方案
最近在学webpack,需要用到sass-loader加载器解析.scss文件,安装sass-loader,必须先安装node-sass,node-sass纠正了两天,用npm install nod ...
- GridView绑定Visible
hyerLinkFiled的显示绑定方式 ,强制类型转换后再绑定! Visible='<%#Convert.ToBoolean(Eval("字段名")) %>'
- java多线程系类:JUC线程池:05之线程池原理(四)(转)
概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...