在NHibernate的单表继承模式下通过父类Repository查询子类

简介:

在NHibernate中经常遇到继承与关系数据库的ORMapping的问题,我之前的一篇博客(http://www.cnblogs.com/studyzy/archive/2011/08/16/2140675.html)介绍了有3种常用的实现方式:

  • Concrete Table Inheritance(具体表继承)
  • Single Table Inheritance(单表继承)
  • Class Table Inheritance(类表继承)

其中单表继承是我个人比较常用比较推荐的做法。使用单表继承可以不用Join多个表查询效率高,而且在Domain Model的属性提示到父类或者下降到子类时,数据库模型不用更改。其缺点就是一个数据表的列比较多,而且很多列为空,不过现代的数据库对空列的压缩处理已经比较好了,不会产生大量空列造成的性能问题和磁盘空间的浪费。

在NHibernate中经常会遇到通过父类的Repository来查询子类的情况,比如现在有一个抽象的Employee对象,下面有OfficeUser和Teacher两个具体的对象,这两个对象都有其特有的属性,比如Teacher会有所领导的班级,而OfficeUser却没有。我们可以将OfficeUser和Teacher都保存到Employee表中,然后建立了一个EmployeeRepository,使用Employee作为Query的入口,那么如果要查询Employee表中所有的Teacher该怎么查呢?下面分别用QueryOver、Criteria和HQL来说明:

  • QueryOver查询Employee表中的所有Teacher:
Session.QueryOver<Employee>().Where(a =>a.GetType() == typeof (Teacher)).List();

这里需要注意的是,条件中使用的是a.GetType()==typeof(Teacher),但是不能使用a is Teacher,虽然这在C#中是一回事,但是NHibernate会对其理解不一样,所以必须这么写,否则查询不出来。

  • Criteria查询Employee表中的所有Teacher:
var cri = Session.CreateCriteria<Employee>();
cri= cri.Add(Expression.Eq("class",typeof(Teacher)));
var ems = cri.List<Employee>();
这里需要注意的是class关键字。必须这么写,不能写成大写的Class,也不能换成其他字,只有这样才能让NHibernate理解,并正确返回结果。
  • HQL查询Employee表中的所有Teacher:
 var cri = Session.CreateQuery("from Employee where Type='Teacher'"); var ems = cri.List<Employee>();

这里又不一样了,where条件后面跟的“Type”是Employee表的Discriminator,是一个列名,也就是通过这一列来区分Employee表的每一条数据到底是OfficeUser还是Teacher。所以,如果你的Discriminator Column是Abc,那么HQL就要写成from Employee where Abc='Teacher'。

以上是以最简单了例子说明了如果通过父类查询具体的子类的方法,实际项目中肯定比这个查询要复杂,但是只要记住了这三种查询的要点,结合其他条件就可以写出NHibernate能够理解的查询。

目录
相关文章
|
SQL 监控 关系型数据库
深入理解MySQL日志:通用查询、慢查询和错误日志详解
深入理解MySQL日志:通用查询、慢查询和错误日志详解
1820 0
|
11月前
|
存储 缓存 监控
Vue.js 九个性能优化技巧
【10月更文挑战第16天】Vue.js 性能优化是一个持续的过程,需要我们不断地探索和实践。通过合理使用上述九个技巧,并结合具体的项目需求和性能指标,我们可以不断地提高 Vue.js 应用的性能和用户体验。
|
9月前
|
机器学习/深度学习 人工智能 机器人
AI技术在医疗领域的应用及挑战
本文将探讨人工智能(AI)在医疗领域的应用及其面临的挑战。我们将从AI技术的定义和分类开始,然后详细介绍其在医疗领域的具体应用,如疾病诊断、药物研发等。最后,我们将讨论AI在医疗领域面临的挑战,包括数据隐私、伦理问题等。
|
JavaScript
解决在vue中设置的height: 100%没有效果
文章讲述了在Vue中设置`height: 100%`无效的问题,并提供了解决方法:确保`html`、`body`和`#app`元素的高度都设置为`100%`,以保证子元素的高度能正确继承父元素的高度。
解决在vue中设置的height: 100%没有效果
|
存储 程序员 调度
[计算机组成原理(唐朔飞 第2版)]第一章 计算机系统概论 & 第二章 计算机的发展及应用(学习复习笔记)
[计算机组成原理(唐朔飞 第2版)]第一章 计算机系统概论 & 第二章 计算机的发展及应用(学习复习笔记)
|
Java Apache
Java代码使用POI导出的单元格加上边框和背景色
【5月更文挑战第3天】Java代码使用POI导出的单元格加上边框和背景色
1224 0
手写C/C++死锁检测
手写C/C++死锁检测
230 0
ERROR: Encountered errors while bringing up the project.
ERROR: Encountered errors while bringing up the project.
282 0
|
SQL 数据可视化 前端开发
简单好用的ElasticSearch可视化工具:es-client和Head
使用 ElasticSearch(简称 es) 的过程中,经常有一些临时查询(如 排查问题、验证效果),一个趁手的可视化工具 可以提高工作效率。个人倾向于 免费(最好开源)、易于安装(如 浏览器插件),`es-client` 就是 比较简单好用的一个,尤其是 查询
11435 0
|
SQL Oracle 关系型数据库
CONVERT 转换函数的简单使用方法
CONVERT 转换函数的简单使用方法
531 0