Mysql
 sql >> Base de données >  >> RDS >> Mysql

utiliser mysql ordre par cas dans les critères d'hibernation

Je pense avoir trouvé une solution.

Au final, j'ai créé ma propre sous-classe de Order et remplacé la méthode publique 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();
}

l'appel important (que j'ai trouvé dans l'implémentation originale de la classe de commande) est le

criteriaQuery.getColumnsUsingProjection(criteria, getPropertyName());

Ce qui m'a donné accès à l'alias de la colonne que je voulais commander en utilisant l'instruction case.

Si quelqu'un d'autre regarde cela, si vous commandez sur une propriété qui n'est pas sur l'objet racine, assurez-vous que vous utilisez des alias dans vos jointures de critères et que vous référencez ensuite ces alias correctement dans votre Order propertyName personnalisé lorsque vous instanciez-le.