[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了。

内容概要:本文介绍了一个基于MATLAB实现的无人机维路径规划项目,采用蚁群算法(ACO)与多层感知机(MLP)相结合的混合模型(ACO-MLP)。该模型通过维环境离散化建模,利用ACO进行全局路径搜索,并引入MLP对环境特征进行自适应学习与启发因子优化,实现路径的动态调整与多目标优化。项目解决了高维空间建模、动态障碍规避、局部最优陷阱、算法实时性及多目标权衡等关键技术难题,结合并行计算与参数自适应机制,提升了路径规划的智能性、安全性和工程适用性。文中提供了详细的模型架构、核心算法流程及MATLAB代码示例,涵盖空间建模、信息素更新、MLP训练与融合优化等关键步骤。; 适合人群:具备一定MATLAB编程基础,熟悉智能优化算法与神经网络的高校学生、科研人员及从事无人机路径规划相关工作的工程师;适合从事智能无人系统、自动驾驶、机器人导航等领域的研究人员; 使用场景及目标:①应用于复杂维环境下的无人机路径规划,如城市物流、灾害救援、军事侦察等场景;②实现飞行安全、能耗优化、路径平滑与实时避障等多目标协同优化;③为智能无人系统的自主决策与环境适应能力提供算法支持; 阅读建议:此资源结合理论模型与MATLAB实践,建议读者在理解ACO与MLP基本原理的基础上,结合代码示例进行仿真调试,重点关注ACO-MLP融合机制、多目标优化函数设计及参数自适应策略的实现,以深入掌握混合智能算法在工程中的应用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值