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.