NHibernate Left加入条件或null

时间:2015-12-07 18:41:19

标签: nhibernate

我有2个对象,ProjectUsageLast30映射为一对一。

我正在尝试查询所有尚未使用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>

1 个答案:

答案 0 :(得分:2)

我仍然不知道为什么在p.UsageLast30上测试null会生成错误的null测试,但是测试null 属性而不是null 对象提供正确的SQL查询。例如:

session.QueryOver<Project>(() => p)
    .Left.JoinAlias(() => p.UsageLast30, () => u)
    .Where(() => u.LastCalculated == null || u.LastCalculated < threshold)

请注意u.LastCalculated == nullu == null

相比较