HQL子查询的意外NULL返回

时间:2013-09-25 04:17:18

标签: c# nhibernate subquery hql

我已经在我的C#Web应用程序中使用NHibernate完成了我的OR映射。当我想获得所有叶节点时,我使用如下的查询语句:

List<NODE> LeafList =(List<NODE>) Session.CreateQuery("from NODE as node where node.Id not in (select FatherNodeId from NODE)").List<NODE>();

但是,我在查询后得到LeafList的计数等于0。我的数据库就像:

Id FatherNodeId
1   NULL
3    1
4    3
5    3

因此,我的预期结果应该是id为4或5的节点。 更令人困惑的是,如果我将“not in”更改为“in”,则查询效果很好,并返回id为1或3的节点。

所以我的不在子查询中有什么问题?

2 个答案:

答案 0 :(得分:0)

使用Not exist关键字

试试这个。

from NODE as node where node.Id not exists ( select  FatherNodeId from NODE)

答案 1 :(得分:0)

  

所以我的不在子查询中有什么问题?

这是一个非常重要的问题,因为一旦知道,使用NULL值时永远不会忘记这个问题。

问题不在于NH或.Net。它具有涉及NULL的布尔表达式的语义。 任何涉及NULL的布尔表达式永远不会为真(这并不意味着它总是为假)并且任何涉及结果的表达式都将永远不会为真。

所以这些查询(其中where子句似乎总是如此)永远不会返回任何结果,因为它们永远不会解析为true:

select 1 where (null=null) or not(null=null)

select 1 where (1=null) or not(1=null)

select 1 where (1<>null) or not(1<>null)

您的查询应该是这样的(不熟悉HQL)

from NODE as node 
    where not exists 
        ( from NODE as child where child.FatherNodeId = node.Id )