2010-04-08 23 views
5

Tôi muốn sắp xếp kết quả của tôi như thế này:Sắp xếp theo null/không null với ICriteria

  • Trước tiên tôi muốn tất cả các hàng/đối tượng, nơi một cột/tài sản không là null, sau đó tất cả các nơi colmn/property là null.
  • Sau đó, tôi muốn sắp xếp theo một cột/thuộc tính khác.

Tôi làm cách nào với ICriteria? Tôi có phải tạo lớp Đặt hàng của riêng mình hay nó có thể được thực hiện với mã hiện tại không?

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

Tôi muốn có một trật tự như thế này:

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

Trả lời

11

Cuối cùng tôi đã có một câu trả lời làm việc cho việc này. Tôi không nghĩ đó là tốt trước khi (10k có thể xem câu trả lời của tôi đã bị xóa), nhưng tôi bắt đầu với một truy vấn SQL:

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

và sau đó chuyển đổi nó để sử dụng các giao diện tiêu chuẩn. Tất cả các đối tượng được sử dụng ở đây đều được tích hợp sẵn.

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

Trong trường hợp của tôi, tôi muốn nulls cuối cùng, nhưng vẫn được đặt hàng bởi NullableProperty cho các giá trị không null. Tuy nhiên, đây là một câu trả lời tuyệt vời mà đã cho tôi 99% con đường ở đó. Đối với bất kỳ ai khác muốn như vậy, chỉ cần thêm vào '.AddOrder (Order.Asc (" NullableProperty ")' sau khi đặt hàng trường hợp nhưng trước OtherProperty. –

0

Tôi không biết gì về ICriteria, nhưng đây là một suy nghĩ. Bạn có thể thử sử dụng SQL tùy chỉnh để tải - nói cách khác, một khối <sql-query> trong ánh xạ của bạn cung cấp cho bạn một cột có thể sắp xếp. Trong Oracle nó sẽ là một cái gì đó như thế này:

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