【问题标题】:Unexpected NULL return of HQL subqueriesHQL 子查询的意外 NULL 返回
【发布时间】:2013-09-25 04:17:18
【问题描述】:

我在我的 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 的节点。

那么我的 not in 子查询有什么问题?

【问题讨论】:

    标签: c# nhibernate subquery hql


    【解决方案1】:

    使用Not exist关键字

    试试这个。

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

    【讨论】:

    • 感谢您的帮助。但是当我尝试使用不存在时,不幸遇到了一个sql语法错误。所以..这可能不是原因
    【解决方案2】:

    那么我的 not in 子查询有什么问题?

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

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

    因此,这些 where 子句似乎始终为真的查询永远不会返回任何结果,因为它们永远不会解析为真:

    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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多