2010-11-09 74 views
1

我有3类,如:用相同名称的属性HQL查询两个子类

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映射猫的Size属性映射映射到CatSize柱和狗的属性DogSize

以下两个查询按预期工作:

From Cat o Where o.Size = 1 
From Dog o Where o.Size = 1 

现在我想查询动物的所有猫科动物,其中大小= 1和人L上的狗,其中大小= 1,这两个查询结合上面我得到:

​​

这显然我想要的东西没有做,我怎么能告诉NHibernate的第一个尺寸是Cat.Size,第二个是狗.Size(最好不知道数据库中的列名)。

注意:我知道设计是有问题的,在不同的子类中有两个同名的属性不是有史以来做出的最聪明的设计决定 - 但现在改变它更成问题,我想避免它(项目应该在几天内交付给客户,我真的不想现在进行设计更改)。我正在使用NHibernate 2.0.1(升级不是一个选项,该程序不适用于NHibernate的后续版本,我们现在没有时间修复它)。

回答

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) 
1

为什么没有在Animal类上定义Size属性?

您可以使用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]; 
+0

在真正的应用程序的属性的意义是在两个子类不同,还有其他没有它的子类,感谢MultiQuery解决方案 – Nir 2010-11-10 08:04:54

相关问题