NHibernate:仅在引用的实体不为空时检查它

时间:2015-03-31 14:41:29

标签: nhibernate reference mapping nullable fluent

表:

  • 名称
    • ID
    • datemodified
  • NameLink
    • ID
    • 填充NameID
    • datemodified

NameLink的映射:

Id(p => p.Id, "id").GeneratedBy.GuidComb();
Map(p => p.DateModified, "datemodified");
References<Name>(p => p.Name, "nameid");

可能会从表中删除名称条目。在我的hql查询中,我试图检查Name是否为null并且仅在它是 - 检查它的datemodified。如果Name为null,我将只检查NameLink的datemodified:

where ($it.Name is not null AND $it.Name.DateModified > 'xxx') OR ($it.DateModified > 'xxx')

如果名称条目被删除,我没有结果,但我应该。我拦截了SQL。 我在WHERE子句中看到第一个检查是&#34; namelink.nameid = name.id&#34;。我相信它是因为参考&lt;&gt;关系。

有人可以帮我修改映射吗?

编辑:我的GET查询转到WebAPI,我们将其转换为HQL。此查询转到BaseController,因此我只能使用OData possibilites修改查询结果,因为代码对于所有其他实体类型是通用的。我得到这种HQL查询from NameExternalLink $it where (($it.Name.DateModifiedUtc > '2015-03-31 11:29:45' OR $it.Name.DateCreatedUtc > '2015-03-31 11:29:45')) or ($it.DateModifiedUtc > '2015-03-31 11:29:45' OR $it.DateCreatedUtc > '2015-03-31 11:29:45')但是如果删除了相应的行,则$ it.Name可能为null。如果存在相应的名称,则查询工作正常,但如果删除它,则会跳过此行。我认为它已被跳过,因为名称由&#34;参考&#34;关系,当hql转换为sql时,它试图通过比较NameLink.nameid = Name.id获取Name,但名称为null。

1 个答案:

答案 0 :(得分:0)

通常,您需要使用的是左连接,此语法将返回您期望的

session
    .CreateQuery("select nl " +
                 " FROM NameLink nl " +
                 "  LEFT JOIN nl.Name n " +
                 " WHERE  n.DateModified > :xxx " + 
                 "    OR nl.DateModified > :xxx " 
    )
    .SetParameter("xxx", someDate)
    // some paging
    .SetMaxResults(2)
    // result just NameLink
    .List<NameLink>();

但实际上,这个WHERE也能正常工作

" WHERE COALESCE(n.DateModified , nl.DateModified ) > :xxx "