Order by null/not null com ICriteria
-
25-09-2019 - |
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
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>