2010-09-29 55 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