当前位置: 首页 > news >正文

NHibernate Issues之1904/1905:相同属性的Domain与Join查询/子查询

概览

这个系列是以博客形式整理关于NHibernate的Issues。记录一些零碎的小例子,通过零零碎碎的整理,可以巩固自己的知识和扩展我们的知识面。这些小例子也可以适当的在项目中呈现。

在接下来的NHibernate2.1.1GA版本中,修正了两个BUG。分别是[NH-1904]和[NH-1905],之所以提出来,我原来也用过这样的情况,但是始终无解,看了这两个链接,原来是BUG,现在我们可以用了~~

两个实例

实例一

如果Domain中没有什么业务逻辑,一般都是使用“贫血模型”,但是有的为了需要增加一些业务逻辑,就慢慢形成了“充血模型”,这篇暂且不谈它们之间的优缺点。我有时使用“充血模型”,需要在Domain中定义一些“保护的或者私有的”属性满足一些逻辑,有时也需要两个相同的属性不同的权限互相赋值什么的,但是这一点NHibernate都不支持(因为是通过映射来找属性的,根据属性命名算法有着不同的访问策略),无奈之下只有使用别的别名代替。

1.Domain

模拟一Domain,有两个(几乎)相同的属性,一个是公共的,一个是保护的。我们操作公共的属性,必要的时候赋值给那个保护的。

public class Invoice { public virtual int Id { get; private set; } public virtual DateTime Issued { get; set; } protected virtual DateTime issued { get; set; } }

2.Mapping

映射这个Domain,这里就映射公共的那个属性用于持久化吧

<class name="Invoice"> <id name="Id"> <generator class="hilo" /> </id> <property name="Issued"/> </class>

3.Test

验证下Save和查询方法。OK

using (var session = OpenSession()) using (var transaction = session.BeginTransaction()) { var invoice = new Invoice {Issued = DateTime.Now}; session.Save(invoice); transaction.Commit(); } using (var session = OpenSession()) { var invoices = session.CreateCriteria<Invoice>().List<Invoice>(); }

实例二

在我们的项目中,错综复杂的关系经常需要Join查询和子查询,但是Join查询我们都在在映射文件中配置关系,如果没有配置关系NHibernate的Join查询就无能为力了,只有Select两张表,然后让两张表的Id相等。这好像是linq to sql的一贯做法。NHibernate在这点上强了很多,只要在映射文件中配置一下,小小查询什么都搞定了。

1.Domain

三个Domain:Master,Details,Element,Master与Elements多对多关系,Detail与Master多对一关系。

public class Master { public virtual int Id { get; set; } public virtual ISet<Element> Elements { get; set; } } public class Detail { public virtual int Id { get; set; } public virtual Master Master { get; set; } } public class Element { public virtual int Id { get; set; } public virtual string Description { get; set; } }

2.Mapping

映射这个Domain。

<class name="Master"> <id name="Id"> <generator class="assigned" /> </id> <set name="Elements" table="MasterElement"> <key column="MasterId" /> <many-to-many column="ElementId" class="Element"/> </set> </class> <class name="Detail"> <id name="Id"> <generator class="assigned" /> </id> <many-to-one name="Master" class="Master" column="MasterId" /> </class> <class name="Element"> <id name="Id"> <generator class="assigned" /> </id> <property name="Description"/> </class>

3.Test

我的目的是要查询Detail信息,Join关联他的Master,还有个子查询判断Master的Elements描述信息e1的数量大于0。下面这句比较经典了。

var det= s.CreateQuery(@"from Detail d left join d.Master m where (select count(e) from d.Master.Elements e where e.Description='e1')>0") .List<Detail>();
http://www.cnnetsun.cn/news/3175296.html

相关文章:

  • 智能办公本X2:端侧AI驱动的手写语音协同工作流
  • 大语言模型解码策略与低资源部署技术详解
  • NHibernate实例分享:Northwind Mapping
  • 2026年全铜卫浴五金洁具厂商口碑情况汇总
  • Vben精讲:06-Vben环境变量配置
  • MoeKoe Music终极指南:如何用开源免费客户端享受VIP音乐体验
  • Python自动化测试·Selenium操控元素的方法
  • 从Qwen-AgentWorld看大模型智能体如何操作真实系统:架构、挑战与工程实践
  • Cline 配置 Claude Sonnet 5 实战指南:思考深度调优与切换 Fable 5 的时机
  • 恶劣天气数据集 极端天气数据集 雨天道路数据集 雾天道路数据集 雪天马路恶劣环境图像目标检测数据集-道路障碍物识别数据集-数据集第10119期
  • 三千米浮空飞艇视频接入,广域立体视频孪生全域侦监技术解读 野外复杂地形动态重建 · 演训场景视频孪生目标三维重构完整体系
  • 毕业生必备7款AI写作辅助网站,一站式搞定选题初稿与降AI率
  • GHelper:华硕笔记本开源高效控制工具的专业替代方案
  • 成都茶台定制推荐
  • YOLOv10模型改进-Neck改进-第74篇:YOLOv10改进策略【Neck】| FPN-DCN可变形卷积
  • 连锁超市收银系统选什么?千店实测与商拓深度测评
  • 【湍流】基于matlab对涡粘性和雷诺应力模型FVM实现湍流通道流【含Matlab源码 15687期】含报告
  • 如何选择合适的面试机构?
  • 一文吃透 Transformers 模型加载:from_pretrained 参数大全与推理全流程解析
  • 磁吸易装 + 稳定传输,打造高效机房 U 位资产管理方案
  • 像素地理锚定标准化模型 Pixel2Geo引擎构建视频孪生空间基准体系 虚实双向指令交互通道 视频孪生联动前端感知设备智能处置技术详解
  • PPO强化学习
  • 嵌入式系统调度算法介绍
  • 【Python环境】从零解读PyCharm项目结构:虚拟环境、外部库与uv包管理器
  • 大模型微调实战:从LoRA原理到Qwen2-7B金融问答模型部署
  • 直方图靠右曝光
  • AI大模型学习指南:从Transformer到RAG与LoRA的体系化入门
  • ASP.NET 首页性能的十大做法
  • 企业级知识库搭建全流程:从数据清洗、向量化存储到RAG问答系统落地
  • 构建Apple Music级动态歌词体验:从架构设计到性能优化的完整技术指南