2013-09-25 194 views
2

我在我的C#web應用程序中使用NHibernate完成了我的OR映射。當我想要獲取所有葉節點時,我使用如下查詢語句:HQL子查詢意外的NULL返回

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 更重要的是混亂,如果我改變「不」到「中」,查詢效果很好,和節點返回節點的ID爲1或3.

那麼最新怎麼了我不在子查詢?

回答

0

使用Not exist關鍵字

試試這個。

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

謝謝你的幫助。但是當我嘗試使用不存在時,不幸的是它遇到了一個sql語法錯誤。所以..這可能不是原因 – Ron

0

所以,什麼是錯我不是在子查詢?

這是一個非常重要的問題,因爲一旦知道這個問題,在處理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)