【发布时间】:2015-06-04 22:54:57
【问题描述】:
表格:
- 名称
- 身份证
- 修改日期
- 名称链接
- 身份证
- nameid
- 修改日期
NameLink 的映射:
Id(p => p.Id, "id").GeneratedBy.GuidComb();
Map(p => p.DateModified, "datemodified");
References<Name>(p => p.Name, "nameid");
名称条目可能已从表中删除。在我的 hql 查询中,我试图检查 Name 是否不为空,并且仅当它为空时 - 检查它的 datemodified。如果 Name 为 null,我将只检查 NameLink 的修改日期:
where ($it.Name is not null AND $it.Name.DateModified > 'xxx') OR ($it.DateModified > 'xxx')
如果名称条目被删除,我不会得到任何结果,但我应该这样做。我已经截获了 SQL。 我看到在 WHERE 子句中,第一个检查是“namelink.nameid = name.id”。我相信这是因为 Reference 关系。
有人可以帮我修改映射吗?
编辑:我的 GET 查询转到 WebAPI,我们将其转换为 HQL。此查询转到 BaseController,因此我只能使用 OData 可能性修改查询结果,因为代码对于所有其他实体类型都是通用的。我得到了这种 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 可能为空。如果存在相应的名称,则查询工作正常,但如果它被删除,则仅跳过此行。我认为它被跳过了,因为 Name 是由“References”关系映射的,当 hql 转换为 sql 时,它试图通过比较 NameLink.nameid = Name.id 但 name 为 null。
【问题讨论】:
-
您让 NHibernate 决定使用哪个 JOIN。它是内在的。您只需要 LEFT JOIN。调整您的 HQL 生成器,以确保您获得 LEFT JOIN。如果没有它,你可以使用任何类型的 IS NOT NULL...但是 INNER JOIN 无论如何都会过滤结果...
标签: nhibernate reference mapping nullable fluent