在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能够理解的查询。

转载于:https://www.cnblogs.com/studyzy/archive/2012/07/04/2576902.html

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

  1. 单继承模式下的JAVA和C++

    总结:单继承模式下JAVA和C++相同,处理代码方面和事后处理方面有点小差异外没有什么本质的不同 JAVA一共3个文件 1.Base.class 2.Child.class(继承Base) 3._Ma ...

  2. rails 两表关联查询_Rails中的单表继承与多态关联:找到适合您的方法

    rails 两表关联查询 by Haley Mnatzaganian 通过海利·姆纳扎卡尼安 Rails中的单表继承与多态关联:找到适合您的方法 (Single-table inheritance v ...

  3. 自动undo表空间模式下切换新的undo表空间

       在undo自动表空间模式下切换新的undo表空间后都需要将老的undo表空间给drop,可是由于切换时由于活动事物并未完全结束,    于是导正drop旧的undo表空间时报"ORA- ...

  4. 关于单表5-10亿行记录如何快速查询的问题,欢迎童鞋们都进来讨论

    我现在要做一套很复杂的反作弊系统,一共有15个左右的规则,有的规则会触发报警,有的规则会触发降权,有的规则会触发监测对象,不知道当5-10亿条数据单表的时候,MS SQL SERVER 2008 对于 ...

  5. python和表格关系_python – 单表继承上的SQLAlchemy一对多关系...

    我之前正在努力解决这个问题.我能够让这种自我指涉关系发挥作用: class Employee(Base): __tablename__ = 'employee' id = Column(Integer ...

  6. php单表显示动态下拉框,PHP:使用optgroup动态下拉列表

    我正在开发一个下拉菜单,该菜单使用HTML optgroups作为员工所属的组名.这是MySQL查询和输出: mysql> SELECT employee.emp_id,employees.em ...

  7. mybatis框架实现一对多、多对多关系查询,以及递归查询(单表多级分类:省市区三级地址查询)

    mybatis框架练习 mybatis框架中,包括实体类(这些实体类与数据库中的字段属性相对应),mybatis的配置文件(即mybatis-config.xml,这个配置文件用于连接实体类和orm( ...

  8. 业务单表 读写缓慢 如何优化?

    大家好,我是不才陈某~ 陈某的知识星球开通了,一个相互交流的技术圈子,陈某会在星球中定期分享干货,如果你也想和球友一起打卡学习进阶,戳链接加入 在前面的文章中探讨了架构优化的两种方案:冷热分离.查询分 ...

  9. Django学习笔记2-使用QuerySet删除和查询单表

    没错·,我又回来啦!!! 紧接着上次的学习笔记: 上次学习笔记链接: https://blog.csdn.net/qq_52158420/article/details/121348654?utm_s ...

最新文章

  1. 支持向量机python代码_用TensorFlow实现多类支持向量机的示例代码
  2. oracle sql字符拆分字符串函数,oracle-是否有在PL / SQL中拆分字符串的功能?
  3. 蓝桥杯java第八届第一题--购物单
  4. python实现矢量分级渲染_用 Python 撸一个 Web 服务器-第4章:动态渲染数据
  5. mysql data_add data_sub
  6. leetcode 75. Sort Colors | 75. 颜色分类(荷兰国旗问题,快速排序)
  7. linux监听端口丢失,linux – 如果没有监听端口,则为Systemd重启服务
  8. new malloc
  9. iOS 随笔 允许所有不安全网络访问项目
  10. Java出现The import javax.servlet cannot be resolved 的解决方法
  11. 【QT学习教程1】制作用户登陆界面
  12. 计算机中1kb等于多少字节,1mb等于多少kb
  13. html的函数都有什么,yearfrac函数什么意思
  14. IPD的决策评审DCP(1):概念、战略性
  15. 【Matlab】彻底清除persistent变量
  16. 2018-2019-2 20175317 实验三《敏捷开发与XP实践》实验报告
  17. 洛谷 5061 秘密任务——二分图染色
  18. Linux 代理 http 和 socks 配置区别
  19. mysql计算均线_MySQL移动平均线 – 4周
  20. ArcGIS Pro3.0.2保姆级安装教程(附安装包)

热门文章

  1. UnityShader1:渲染流水线
  2. matlab字符串转换
  3. 安卓使用MediaPlayer自定义音频视频播放器
  4. js中函数参数arguments、callee、caller,值传递、重载
  5. 【Proteus仿真8086实验一】RAM存储器62256
  6. mysql常见内置函数
  7. 【Flask】ORM关系以及一对多
  8. System.Web.AspNetHostingPermission 类型的权限已失败
  9. HTML1.0 - html 环境搭建 开发工具
  10. 谈谈为什么要系统学习算法-开复的一篇文章