我有3个类,如:
public class Animal
{
... all sort of data ...
}
public class Cat : Animal
{
... more data ...
public virtual int Size { get; set; }
}
public class Dog : Animal
{
... other data ...
public virtual int Size { get; set; }
}
使用hbm.xml映射中的“table per hierarchy”策略映射类,Cat的Size属性映射到CatSize列,Dog的属性映射到DogSize
以下两个查询按预期工作:
From Cat o Where o.Size = 1
From Dog o Where o.Size = 1
现在我想查询Animal为所有尺寸= 1的猫和所有尺寸= 1的狗,结合上面的两个查询得到:
From Animal Where o.Size = 1 Or o.Size = 1
这显然不能做我想要的,我怎么能告诉NHibernate第一个Size是Cat.Size,第二个是Dog.Size(最好不知道数据库中的列名)。
注意:我理解设计是有问题的,在不同的子类中有两个具有相同名称的属性并不是最有史以来最聪明的设计决定 - 但现在改变它更成问题,我想避免它(项目应该在几天内交付给客户,我现在真的不想改变设计。)
我正在使用NHibernate 2.0.1(升级不是一个选项,该程序不适用于更高版本的NHibernate,我们现在没有时间修复它。)
答案 0 :(得分:1)
为什么不在Size
类上定义Animal
属性?
您可以使用MultiQuery在一次往返中执行2个查询,这也会为您提供结果。 我认为这将是最好的解决方案......
IMultiQuery q = session.CreateMultiQuery();
q.Add("from Cat where Size = 1");
q.Add("from Dog where Size = 1");
var results = q.List();
var cats = (IList)results[0];
var dogs = (IList)results[1];
答案 1 :(得分:1)
试试这个......
select a from Animal a where a in (select c from Cat c where c.Size = 1) or a in (select d from Dog d where d.Size = 1)