2010-04-08 79 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>