我想像这样对结果进行排序:
我如何使用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
答案 0 :(得分: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"));
答案 1 :(得分: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>