Ich glaube, ich habe eine Lösung gefunden.
Am Ende habe ich meine eigene Unterklasse von Order erstellt und die öffentliche Methode String toSqlString(Criteria,CriteriaQuery) überschrieben:
@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();
}
Der wichtige Aufruf (den ich in der ursprünglichen Implementierung der Order-Klasse gefunden habe) ist
criteriaQuery.getColumnsUsingProjection(criteria, getPropertyName());
Dadurch erhielt ich Zugriff auf den Alias für die Spalte, die ich bestellen wollte, indem ich die case-Anweisung verwendete.
Wenn sich jemand anderes dies ansieht und Sie nach einer Eigenschaft bestellen, die sich nicht im Stammobjekt befindet, stellen Sie sicher, dass Sie Aliase in Ihren Kriterienverknüpfungen verwenden und dass Sie diese Aliase dann korrekt in Ihrem benutzerdefinierten Order-Eigenschaftsnamen referenzieren, wenn Sie instanziieren.