2010-11-09 108 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

相關問題