我在查询中使用以下代码
var query = session.CreateSQLQuery(sqlQuery)
.AddEntity("g", typeof(AllegroGoalContract))
.AddJoin("gd", "g.GoalDetail")
.SetInt32("max", max.Value)
.SetGuid("callerId", ServerContext.Current.TeamMemberUniqueId)
.SetInt32("ver", lastChange);
它使用以下映射:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="Methodology" >
<class name="SixDisciplines.AllegroGoalContract, SixDisciplines" table="Goal" lazy="false">
.
.
<one-to-one name="GoalDetail" class="SixDisciplines.AllegroGoalDetailContract, SixDisciplines" constrained="false"/>
.
.
</class>
</hibernate-mapping>
这是SQL的一小部分示例。实际的SQL使用特定于Sql Server的功能,但这个简化的SQL演示了同样的问题:
SELECT
g.UniqueId AS {g.UniqueId},
g.Description AS {g.Description},
g.StatusId AS {g.Status},
gd.UniqueId AS {gd.UniqueId},
gd.ActualEnd AS {gd.ActualEnd}
FROM Methodology.Goal g
LEFT JOIN Methodology.GoalDetail gd ON g.UniqueId = gd.UniqueId
现在我的sql查询返回所有AllegroGoalContract实例以及GoalDetail一对一关联。请注意,一对一关联的映射具有约束=“false”设置,表明每个AllegroGoalContract都不必有GoalDetail。
当我运行此代码时,我看到我的查询运行但后来我看到nhibernate为每个AllegroGoalContract实例发出一个单独的查询,其中我的查询为GoalDetail返回null。我怀疑这是因为nhibernate不知道是否返回了null,因为它是一个延迟加载,或者因为它确实不存在。
那么我怎么能告诉nhibernate来自CreateDQuery调用GoalDetails的null真的意味着它们不在那里所以不要去尝试再次获取它们。
答案 0 :(得分:1)
NHibernate映射节点 - <one-to-one/>
有一个名为fetch的属性,默认值为 - select,它为每个附属实体创建一个单独的查询。
如果您希望NHibernate使用SQL Join更改为 -
<one-to-one name="GoalDetail" class="SixDisciplines.AllegroGoalDetailContract, SixDisciplines" constrained="false" fetch="join" outer-join="true"/>