Mysql
 sql >> Database >  >> RDS >> Mysql

usando mysql ordine per caso nei criteri di ibernazione

Penso di aver trovato una soluzione.

Alla fine ho creato la mia sottoclasse di Order e ho sovrascritto il metodo pubblico 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 chiamata importante (che ho trovato nell'implementazione originale della classe order) è

criteriaQuery.getColumnsUsingProjection(criteria, getPropertyName());

Il che mi ha dato accesso all'alias per la colonna che volevo ordinare utilizzando la dichiarazione del caso.

Se qualcun altro sta guardando questo, se stai ordinando su una proprietà che non si trova sull'oggetto radice, assicurati di utilizzare alias nei tuoi criteri join e di fare riferimento a tali alias correttamente nel tuo Order propertyName personalizzato quando lo fai istanziarlo.