Pergunta

Eu gostaria de classificar o resultado como este:

  • Primeiro eu quero todas linhas/objetos, onde uma coluna/propriedade não é nulo, e , em seguida, todos os onde colmn/propriedade é nulo.
  • Então eu quero classificar por outra coluna/propriedade.

Como posso fazer isso com ICriteria?Tenho para criar a minha própria Ordem de classe, ou se pode ser feito com o código existente?

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

Eu gostaria de ter um fim como este:

NullableProperty  OtherProperty
----------------  -------------
1                 2
8                 7
5                 9
NULL              1
NULL              3
NULL              8
Foi útil?

Solução

Eu, finalmente, ter uma resposta para isso.Eu não achava que era possível antes (10k pode ver o meu excluída a resposta), mas eu comecei com uma consulta SQL:

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

e depois convertido para utilizar os critérios de interfaces.Todos os objetos usados aqui são incorporadas.

ICriteria criteria =
    session.CreateCriteria(typeof(NullableEntity))
    .AddOrder
    (
        Order.Asc
        (
            Projections.Conditional
            (
                Restrictions.IsNull("NullableProperty"),
                Projections.Constant(1),
                Projections.Constant(0)
            )
        )
    )
    .AddOrder(Order.Asc("OtherProperty"));

Outras dicas

Não sei nada sobre Icriteria, mas aqui está um pensamento. Você pode tentar usar o SQL personalizado para carregar - em outras palavras, um <sql-query> Bloqueie o seu mapeamento que oferece uma coluna classificável. No Oracle, seria algo assim:

<sql-query ...>
  <return ...>
  select *, nvl2(my_column, 1, 0) as not_null
  from my_table
  where id=?
  for update
</sql-query>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top