sql >> Base de Datos >  >> RDS >> Mysql

usando mysql order by case en criterios de hibernación

Creo que encontré una solución.

Al final creé mi propia subclase de Orden y anulé el método público 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();
}

la llamada importante (que encontré en la implementación original de la clase order) es

criteriaQuery.getColumnsUsingProjection(criteria, getPropertyName());

Lo que me dio acceso al alias de la columna que quería ordenar usando la declaración del caso.

Si alguien más está mirando esto, si está ordenando una propiedad que no está en el objeto raíz, entonces asegúrese de usar alias en sus uniones de criterios y luego haga referencia a esos alias correctamente en el nombre de propiedad de su pedido personalizado cuando instanciarlo.