2010-04-08 80 views
5

空,我想我的排序結果是這樣的:訂購空/不帶的ICriteria

  • 首先我想所有的行/對象,其中一列/屬性不爲空,那麼所有的地方colmn/property 爲空
  • 然後我想按另一列/屬性排序。

我該怎麼做ICriteria?我是否必須創建自己的訂單類,還是可以使用現有的代碼來完成?

ICriteria criteria = Session.CreateCriteria<MyClass>() 
    .AddOrder(Order.Desc("NullableProperty")) // What do I do here? IProjection? Custom Order class? 
    .AddOrder(Order.Asc("OtherProperty")); 

我想有一個順序是這樣的:

NullableProperty OtherProperty 
---------------- ------------- 
1     2 
8     7 
5     9 
NULL    1 
NULL    3 
NULL    8 

回答

11

我終於有一個工作的答案。我不認爲這是可能的之前(10K的可以看到我的答案被刪除),但我開始用一個SQL查詢:

SELECT Id, NullableProperty, OtherProperty 
    FROM NullableSorting 
    ORDER BY 
     (CASE WHEN NullableProperty IS NULL THEN 1 ELSE 0 END), 
     OtherProperty 

,然後將其轉換爲使用標準接口。這裏使用的所有對象都是內置的。

ICriteria criteria = 
    session.CreateCriteria(typeof(NullableEntity)) 
    .AddOrder 
    (
     Order.Asc 
     (
      Projections.Conditional 
      (
       Restrictions.IsNull("NullableProperty"), 
       Projections.Constant(1), 
       Projections.Constant(0) 
      ) 
     ) 
    ) 
    .AddOrder(Order.Asc("OtherProperty")); 
+0

在我的情況下,我希望空值最後,但仍然按NullableProperty爲非空值排序。然而,這是一個很好的答案,讓我有99%的選擇。對於任何想要相同的人,只需在案例排序之後但在OtherProperty之前添加'.AddOrder(Order.Asc(「NullableProperty」)'。 – 2014-09-10 19:36:09

0

我不知道什麼的ICriteria,但這裏有一個想法。您可以嘗試使用自定義SQL進行加載 - 換言之,映射中的<sql-query>塊可爲您提供可排序的列。在甲骨文它會是這樣的:

<sql-query ...> 
    <return ...> 
    select *, nvl2(my_column, 1, 0) as not_null 
    from my_table 
    where id=? 
    for update 
</sql-query>