C# NHibernate:使用带有一对一映射的createSQLQuery会导致额外的查询
我在查询中使用以下代码C# NHibernate:使用带有一对一映射的createSQLQuery会导致额外的查询,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,我在查询中使用以下代码 var query = session.CreateSQLQuery(sqlQuery) .AddEntity("g", typeof(AllegroGoalContract)) .AddJoin("gd", "g.GoalDetail") .SetInt32("max", max.Value) .SetGuid("callerId", ServerContext.Current.TeamMemberUniqueId) .SetIn
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查询返回所有AllegroGoalContract实例以及GoalDetail一对一关联。请注意,一对一关联的映射具有constraint=“false”集,表示不必为每个AllegroGoalContract都设置一个goaldeail
当我运行这段代码时,我看到我的查询正在运行,但随后我看到nhibernate为每个AllegroGoalContract实例发出了一个单独的查询,其中我的查询为GoalDetail返回null。我怀疑这是因为nhibernate不知道是因为它是延迟加载还是因为它确实不存在而返回null
因此,我如何告诉nhibernate,对GoalDetails的CreateSQLQuery调用中的null实际上意味着它们不在那里,所以不要再尝试获取它们。nhibernate映射节点-
有一个名为fetch的属性,默认值是-select,它为每个附加实体进行单独的查询。
如果希望NHibernate使用SQL连接,请更改为-
<one-to-one name="GoalDetail" class="SixDisciplines.AllegroGoalDetailContract, SixDisciplines" constrained="false" fetch="join" outer-join="true"/>
我尝试使用fetch=“join”命令,但它对如何解释CreateSQLQuery调用的结果没有任何影响。它仍然会发出单独的添加查询。请尝试将“outer join=“true”添加到“”映射。结果仍然与以前相同。为什么要在CreateSQLQuery中创建另一个连接?您是指.AddJoin(“gd”,“g.GoalDetail”)?我使用它来填充由SQL返回的AllegroGoalContract GoalDetail关联。我是否应该使用不同的CreateSQLQuery语法来代替AddJoin?为什么要使用CreateSQLQuery?因为这是一个使用SQL Server特定功能的复杂查询。因此,上面的查询中未显示的内容?是的。我没有详细介绍SQL查询,因为它对CreateSQLQuery的使用没有意义。
<one-to-one name="GoalDetail" class="SixDisciplines.AllegroGoalDetailContract, SixDisciplines" constrained="false" fetch="join" outer-join="true"/>