我有 2 个对象,Project
和 UsageLast30
一对一映射。
我正在尝试查询还没有 UsageLast30 或具有日期属性在阈值之前的 UsageLast30 的所有项目。
如果我使用查询,我会得到一个空引用异常:
session.QueryOver<Project>(() => p)
.Left.JoinAlias(() => p.UsageLast30, () => u)
.Where(() => u == null || u.LastCalculated < threshold)
以下备选方案运行,但不会产生我期望的 SQL。
session.QueryOver<Project>(() => p)
.Left.JoinAlias(() => p.UsageLast30, () => u)
.Where(Restrictions.Or(
Restrictions.Where<Project>(x => x.UsageLast30 == null),
Restrictions.Where(() => u.LastCalculated < threshold)
))
这给出了一个 WHERE 条件:
WHERE (this_.project_id is null
or u1_.last_calculated < '2015-09-08T18:18:51' /* @p0 */)
null
测试在 Project 上进行,而不是像我预期的那样在 UsageLast30 上进行。
我如何构建这个查询?
映射如下:
<class name="Analytics.Core.Project" table="project">
<id name="Id" column="project_id">
<generator class="identity" />
</id>
<!-- ... -->
<one-to-one name="UsageLast30" constrained="false" foreign-key="none" />
</class>
<class name="Analytics.Core.ProjectUsageLast30" table="project_usage30">
<id name="ProjectId" column="project_id">
<generator class="foreign">
<param name="property">Project</param>
</generator>
</id>
<!-- ... -->
<one-to-one name="Project" constrained="true" />
</class>
最佳答案
我仍然不知道为什么在 p.UsageLast30
上测试 null 会生成错误的 null 测试,而是测试 null property 而不是 null object 给出正确的 SQL 查询。例如:
session.QueryOver<Project>(() => p)
.Left.JoinAlias(() => p.UsageLast30, () => u)
.Where(() => u.LastCalculated == null || u.LastCalculated < threshold)
注意 u.LastCalculated == null
与 u == null
关于NHibernate Left Join with condition or null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34140800/