2010-09-29 53 views
0

我想用懶惰的多對一關聯來運行條件查詢。這些關聯在HBM中設置爲lazy="false"。這是因爲我們急切地使用它的90%的項目。如何在HBM中定義lazy = false時使用setFetchMode(Lazy)運行Nhibernate ICriteria查詢?

但有幾個'大'的查詢應該運行爲lazy="proxy"

HBM:

<many-to-one name="DestinationElement" class="X" column="DstElemId" not-null="true" unique="false" cascade="save-update" outer-join="auto" fetch="select" lazy="false" index="IDX_Ass_DestElem"> 

標準設置:

criteria.SetFetchMode("DestinationElement", FetchMode.Lazy); 

它的工作原理相反的方向,但不是這樣。它熱切地獲取。

LOC是20K +,它會是一個巨大的重構,以相反的方式做。

我該如何強制這種方式只在需要時才能懶惰地取回,並且在其他時間急切地取出?

提前致謝!

回答

1

在HBM lazy="false"不能在查詢被重寫(除了是一個壞主意的99%的時間)

你必須改變你的代碼。

+0

謝謝。在此期間,我意識到這是無法完成的。所以,我們將更改代碼。 – user461828 2010-09-30 17:16:34

+0

有這個選擇會很好,但據我所知,這是一個設計問題,爲什麼我們急切地使用了一些關聯。這是因爲我們需要急切地獲取屬性作爲真實對象:我們需要投射,但它被當作真實對象的父對象,因此不可能投射。例如。我們有一位患者,擁有屬於治療師的人物。實際上,這個人永遠是一個繼承自Person的Doctor。所以,當我懶得取人時,我不能將它投給Doctor,因爲只有「人物部分」可用。 這是因爲有錯誤的'等於'方法 – user461828 2010-09-30 17:20:51

+0

因此,讓治療師懶惰地成爲人,它不能投給醫生。但是,如果我們設置財產以獲取它,它就是一位醫生。這就是我們爲什麼這樣使用它的原因。但是當取多個病人時,所有的醫生也都被抓取了。在這種情況下,它變得很慢。我知道它也可以加入,但這種方式的查詢大小爲100K +,而Oracle無法處理它。所以,這是一個複雜的情況,需要立即快速和骯髒的解決方案。但是,正如我們所知,qad解決方案總是被回擊:D – user461828 2010-09-30 17:31:39