5

我想像这样对我的结果进行排序:

  • 首先,我想要列/属性不为 null的所有行/对象,然后是 colmn/property为 null的所有行/对象。
  • 然后我想按另一列/属性排序。

如何使用 ICriteria 做到这一点?我必须创建自己的 Order 类,还是可以使用现有代码来完成?

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
4

2 回答 2

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"));
于 2010-08-28T18:24:18.240 回答
0

我对ICriteria一无所知,但这是一个想法。您可以尝试使用自定义 SQL 进行加载 - 换句话说,<sql-query>映射中的一个块为您提供可排序的列。在 Oracle 中,它会是这样的:

<sql-query ...>
  <return ...>
  select *, nvl2(my_column, 1, 0) as not_null
  from my_table
  where id=?
  for update
</sql-query>
于 2010-04-08T19:13:56.680 回答