Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

usando mysql ordem por caso em critérios de hibernação


Acho que encontrei uma solução.

No final, criei minha própria subclasse de Order e substituí o método public String toSqlString(Criteria,CriteriaQuery):
@Override
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) {
    final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, getPropertyName() );
    final StringBuilder fragment = new StringBuilder();
    fragment.append(" case ").append(columns[0]);
    fragment.append(" when 'pending' then 1 ");
    fragment.append(" when 'approved' then 1 ");
    fragment.append(" else 2 end");
    return fragment.toString();
}

a chamada importante (que encontrei na implementação original da classe order) é a
criteriaQuery.getColumnsUsingProjection(criteria, getPropertyName());

O que me deu acesso ao alias da coluna que eu queria ordenar usando a instrução case.

Se mais alguém estiver olhando para isso, se você estiver solicitando em uma propriedade que não está no objeto raiz, certifique-se de usar aliases em suas junções de critérios e, em seguida, fazer referência a esses aliases corretamente no seu pedido personalizado propertyName quando você instanciá-lo.