[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进行查询
添加存储过程
![复制代码](http://common.cnblogs.com/images/copycode.gif)
create proc [dbo].[ps_Search] @CustomerID uniqueidentifier begin select * from TB_Customer where CustomerID=@CustomerID end
![复制代码](http://common.cnblogs.com/images/copycode.gif)
在映射文件中使用 sql-query 并定义 sql-query 查询的名称
1 !--需要和class节点同一级别-- 2 sql-query name="ps_Search" 3 return / 4 exec ps_Search :CustomerID 5 /sql-query
测试
在数据访问层中,使用ISession接口提供的GetNamedQuery方法来调用带命名的存储过程,并传递一个整形参数。代码如下:
![复制代码](http://common.cnblogs.com/images/copycode.gif)
1 /// summary 2 /// 使用存储过程,进行查询 3 /// /summary 4 /// returns /returns 5 public IList Customer SearchCustomerByIDUsingProc(Guid customerID) 7 ISession session = NHibernateHelper.GetSession(); 8 //参数为映射文件中为 sql-query 节点指定的name 10 return session.GetNamedQuery("ps_Search") 11 .SetGuid("CustomerID", customerID) 12 .List Customer (); 13 }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
结果
生成的sql语句
1 exec sp_executesql Nexec ps_Search @p0,N@p0 uniqueidentifier,@p0=DDF63750-3307-461B-B96A-7FF356540CB8
如果就想返回一个实体的一部分属性怎么办?
修改存储过程,只选择需要的字段
![复制代码](http://common.cnblogs.com/images/copycode.gif)
1 ALTER proc [dbo].[ps_Search] 2 @CustomerID uniqueidentifier 4 begin 5 select CustomerName from TB_Customer 6 where CustomerID=@CustomerID 7 end
![复制代码](http://common.cnblogs.com/images/copycode.gif)
修改映射文件
!--需要和class节点同一级别-- sql-query name="ps_Search" !-- return / -- return-scalar column="CustomerName" type="String"/ exec ps_Search :CustomerID /sql-query
修改方法
![复制代码](http://common.cnblogs.com/images/copycode.gif)
1 /// summary 2 /// 使用存储过程,进行查询 3 /// /summary 4 /// returns /returns 5 public string SearchCustomerNameUsingProc(Guid customerID) 7 ISession session = NHibernateHelper.GetSession(); 8 //参数为映射文件中为 sql-query 节点指定的name 9 return session.GetNamedQuery("ps_Search") 10 .SetGuid("CustomerID", customerID).UniqueResult().ToString(); 11 }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
结果
因为执行的是存储过程,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
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。
转载:http://www.cnblogs.com/wolf-sun/p/4093539.html
C#——Nhibernate探索 C#—Nhibernate探索 本篇文章,让我们一起来探索Nhibernate。 首先我们去搜索Nhibernate下载地址,如下链接所示。 该版本可能是最新版,我下载的4.0.4.GA。其中GA意思我没搞清楚。
ibatis调用sqlserver存储过程 获取分页的每页结果存储过程 CREATE PROCEDURE [dbo].[mst_sp_pageshowex4] --输入参数 @qCols varchar(8000), -- @qTables varchar(8000), -- @qWhere varchar(8000), -- @oK
相关文章
- 如何查找Fiori UI上某个字段对应的后台存储表的名称
- Cocos2dx 3.0 过渡篇(十五)帧动画的存储播放
- 【Mysql 学习】MyISAM存储引擎(一)。
- sql serve存储过程
- 数据库原理之存储过程和函数
- 360WiFi文件夹存储位置
- JavaScript 库-localforage离线存储
- 数据库-存储过程
- KVM如何以HADOOP作共享存储?
- 如何调试oracle,sqlserver存储过程
- Oracle常用存储过程写法
- Java-JDBC调用批处理、存储过程、事务
- 查询SQL存储过程创建时间
- 如何理解表格存储的多版本、生命周期和有效版本偏差
- 存储过程分页
- [Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图
- SQLSERVER存储过程语法详解
- Paip.断点调试MYSQL存储过程跟函数的解决方案大法
- mysql存储过程——procedure[prəˈsiːdʒər]
- 一张图读懂什么是专属分布式存储
- mysqldump导出--数据+结构+(函数+存储过程)
- oracle存储过程实例
- Kubernetes(k8s)持久化存储PV和PVC
- Elasticsearch压缩索引——lucene倒排索引本质是列存储+使用嵌套文档可以大幅度提高压缩率
- MySQL 存储过程与函数
- Oracle 存储过程和方法全攻略:实战详解调用技巧与注意事项