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

本文转自深蓝居博客园博客,原文链接:http://www.cnblogs.com/studyzy/archive/2012/07/04/2576902.html,如需转载请自行联系原作者

相关文章
|
C++
28.【C++ 继承与派生 (详解)】(二)
28.【C++ 继承与派生 (详解)】
75 0
|
程序员 C++
28.【C++ 继承与派生 (详解)】(一)
28.【C++ 继承与派生 (详解)】
89 0
|
8月前
|
安全 Java 编译器
C++:继承与派生
C++:继承与派生
|
8月前
|
Java
JavaSE碎碎念:抽象类继承被子类继承之后方法调用关系
JavaSE碎碎念:抽象类继承被子类继承之后方法调用关系
|
设计模式 Java 开发者
Spring框架中JavaBean的生命周期及单例模式与多列模式
Spring框架中JavaBean的生命周期及单例模式与多列模式
144 0
【JavaSE】继承和多态重点语法知识汇总
【JavaSE】继承和多态重点语法知识汇总
【JavaSE】继承和多态重点语法知识汇总
C++中的继承和派生
C++ 中的继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。 继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。 在C++中,派生(Derive)和继承是一个概念,只是站的角度不同。继承是儿子接收父亲的产业,派生是父亲把产业传承给儿子。 被继承的类称为父类或基类,继承的类称为子类或派生类。“子类”和“父类”通常放在一起称呼,“基类”和“派生类”通常放在一起称呼。 派生类除了拥有基类的成员,还可以定义自己的新成员,以增强类的功能。
继承和派生
🐰继承和派生的概念 🐰派生类的声明 🐰派生类的构成 🌸1.从基类接受成员 🌸2.调整从基类接受的成员 🌸3.增加新成员 🐰派生类中基类成员的访问属性 🌸公用继承: 🌸私有继承: 🌸受保护的继承: 🐰总结
|
Java
Java面向对象(1)--对象的创建使用类的实例化
Java面向对象(1)--对象的创建使用类的实例化
89 1

热门文章

最新文章

下一篇
开通oss服务