5

結果を次のように並べ替えたいと思います。

  • 最初に、列/プロパティが null でないすべての行/オブジェクトが必要です。次に、列/プロパティ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 に答える