2012-06-26 120 views
3

我正在使用Hibernate 3與MySQL數據庫(我試過用Hibernate 4沒有更多的成功)。我已經實現了一個每個具體類繼承策略(union-subclass)。休眠繼承性能

它使得除多態查詢之外的工作成爲可能。 Hibernate會在其中的「在那裏」的條款是在高級別查詢UNION基於查詢:

select primKey, param1, param2 from (
    select primKey, param1, param2 from Concrete1 
    union 
    select primKey, param1, param2 from Concrete2 
) 
where primKey == <value> 
order by param1 
limit 100 

這會導致非常糟糕的表現作爲整個混凝土表內容加載,而因爲p鍵是一個屬性抽象父母,子句中可以定義「where」子句。

因此,目標將是獲得休眠產生這種查詢:

select primKey, param1, param2 from (
    select primKey, param1, param2 from Concrete1 where primKey == <value> 
    union 
    select primKey, param1, param2 from Concrete2 where primKey == <value> 
) 
order by param1 
limit 100 

這樣,查詢即時執行。

任何想法如何配置Hibernate來改變這種行爲?

感謝

Y.

+0

不知道有關hibernate的問題,但爲什麼不使用存儲過程,其中讓我們說有輸入參數primKey和limit;甚至一個視圖(優化視圖 - 索引等) - 視圖將保存union Croncrete1和Concrete2表,並將從mView中選擇[cols],其中primKey = value order by [cols] limit?,?。 –

回答

0

我曾經掙扎於類似的性能問題,但找到的唯一解決方案是(ATLEAST當時)到實現切換到"Table per class hierarchy"這給了更好的性能,因爲它不要求工會或聯合。它不是精簡的架構明智的,但如果你只有幾個子類可能是不錯的選擇。