hibernate - 子对象上 CreateCriteria 时的延迟初始化异常
问题描述
这种情况我真的不明白,我有两个对象Doctor和Appointment,这2个表是通过一个Id映射表链接的:
医生.hbm.xml:
<bag name="Appointments" table="AppointmentDoctor" lazy="true">
<key>
<column name="DoctorId"/>
</key>
<many-to-many class="Appointment">
<column name="AppointmentId"/>
</many-to-many>
</bag>
当我做这个请求时,它工作正常:
var criteria = session.CreateCriteria(typeof(Doctor));
criteria.SetFetchMode("Appointments", FetchMode.Join);
添加 SetFetchMode 的事实正确返回 Appoinment。
但是,一旦我创建了这样的子查询:
var criteria = session.CreateCriteria(typeof(Doctor));
criteria.SetFetchMode("Appointments", FetchMode.Join);
//New sub query
var appointmentsCriteria = criteria.CreateCriteria("Appointments");
appointmentsCriteria.Add(Restrictions.Eq("AppointmentState", AppointmentState.Cancelled));
Appointment 上的获取不再完成,稍后我得到一个延迟初始化异常。
知道为什么会这样吗?
解决方案
criteria.CreateCriteria("Appointments")
覆盖您使用criteria.SetFetchMode("Appointments", FetchMode.Join);
. 默认情况下不获取内部连接的集合条件。所以你必须使用左连接:
//Collection criteria must be left joined to be fetched
var appointmentsCriteria = criteria.CreateCriteria("Appointments", JoinType.LeftJoin);
或者,如果您使用的是 NHibernate 5.2+,您可以使用它SelectMode.Fetch
来获取内部连接的集合:
var appointmentsCriteria = criteria.CreateCriteria("Appointments")
.Fetch(SelectMode.Fetch, string.Empty);
更多关于SelectMode
可以在这里找到
推荐阅读
- android - “flutter run”卡在“Running Gradle task 'assembleDebug”
- sql-server - 该表应该是数据仓库中的维度表还是事实表
- typescript - 打字稿守卫在联合类型上失败
- c# - 从查询参数中获取动态对象
- angular - 从第 n 个孩子 2 到父母的角度输出变量
- python - 使用 Python/Pandas 以 csv 中的开始时间和结束时间日期时间列按小时分组
- python-3.x - 当我安装新版本的 python 时,我需要再次安装软件包
- python - 两次调用函数并传递不同的参数 - 第一次调用有效,但第二次返回 null
- windows - MOZ_PLUGIN_VALUE Windows 环境变量默认值?
- swift - 在 Swift 中导入模块