表:
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。
答案 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 "