我正在尝试优化对DB的查询。目前我们有这样的映射,但它可能在未来增长。我们正在对对象A执行大量小操作,并且大多数操作不需要加载所有数据。同时,为了在UI上显示数据,我们需要立即加载所有员工。
我试图添加额外的映射,但看起来这不是一个例子。
这是映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" default-lazy="false">
<class name="A" table="A" discriminator-value="?" dynamic-update="true" >
<cache usage="nonstrict-read-write"/>
<id name="AId" column="aId">
<generator class="guid.comb" />
</id>
<bag name="B" table="B" inverse="true" outer-join="false" lazy="false" batch-size="50" >
<cache usage="nonstrict-read-write"/>
<key column="aId" />
<one-to-many class="B" />
</bag>
<many-to-one name="C" column="cId" class="C" outer-join="true" not-found="ignore" />
<many-to-one name="D" column="dId" class="D" outer-join="true" not-found="ignore" />
</class>
</hibernate-mapping>
是否可以在ICriteria中指定只检测疼痛对象A或具有任何设置内部对象B,C或D的对象A
感谢。
答案 0 :(得分:1)
NHibernate确实有解决方案。实际上,这个ORM工具的设计正是这些场景所期望的。但首先,请尝试停止使用不延迟映射。
换句话说,我们必须做到这一点。保持映射延迟,并强制查询 ad hoc eager 。想了解一下:
后续步骤。将所有映射更改为lazy="true"
...或跳过它,因为懒惰是默认值。不要使用default-lazy =“false”。
让所有映射都支持懒惰,我们可以在查询中覆盖该行为。所以实际上所有这些A,B,C都将在这个查询中选择一个SELECT发送到数据库引擎:
var criteria = session.CreateCriteria<A>()
.CreateAlias("B", "b")
.CreateCriteria("C");
我们还可以指定JOIN的类型(内部,左侧)。同时检查NHibernate - CreateCriteria vs CreateAlias。还有更多...
以下是文档中的一些起点(类似章节16 QueryOver):
一旦玩了更多(以及one-to-many
/ collections),也请检查: