You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NHibernate中JoinAlias获取子列表异常及SQL重复列问题咨询

NHibernate中JoinAlias获取子列表异常及SQL重复列问题咨询

我最近在使用NHibernate时遇到了一个困惑的问题,场景是这样的:我有两个实体类,ExamType包含一个Exams列表,我的目标是查询获取指定ID的ExamType,同时把它关联的所有Exams列表也一起加载出来,但实际操作中出现了两个奇怪的现象,想请教大家原因。

第一个查询:内连接仍触发懒加载

我先执行了以下查询代码:

session.QueryOver<Examtype>(() => examTypeAlias)
    .JoinAlias(e => e.Exams, () => examAlias)
    .Where(e => e.Id == 12345)
    .Future<Examtype>();

NHibernate生成的SQL是这样的:

SELECT
examType.Id as id,
exam1.Id as examId,
exam1.ExamTypeId as examExamTypeId,
FROM
Examtype examType
inner join Exam exam1 on examType.Id = exam1.ExamTypeId
WHERE
examType.Id = 12345

从SQL来看,明明已经通过内连接查询出了关联的所有Exam记录,但返回的ExamType对象却依然会对Exams列表触发懒加载,这完全不符合我的预期。

第二个查询:左连接实现预加载但SQL生成重复列

之后我把连接方式改成了左外连接,代码如下:

session.QueryOver<Examtype>(() => examTypeAlias)
    .Left.JoinAlias(e => e.Exams, () => examAlias)
    .Where(e => e.Id == 12345)
    .Future<Examtype>();

这次生成的SQL变成了这样:

SELECT
examType.Id as id,
exam1.Id as examId1,
exam1.ExamTypeId as examExamTypeId1,
exam2.Id as examId2,
exam2.ExamTypeId as examExamTypeId2,
FROM
Examtype examType
left outer join Exam exam1 on examType.Id = exam1.ExamTypeId
WHERE
examType.Id = 12345

这次倒是实现了Exams的预加载(eager loading),但新的问题来了——SQL里居然重复生成了两次Exam的列(exam1和exam2的字段),这看起来完全没有必要。

我实在搞不懂这两个现象背后的原因:为什么第一个内连接的查询明明SQL已经返回了关联数据,却还是会触发懒加载?为什么第二个左连接的查询会生成重复的Exam列?有没有熟悉NHibernate的朋友能帮忙解释一下?

备注:内容来源于stack exchange,提问作者Ferdossi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:52:46