Мисля, че намерих решение.
В крайна сметка създадох свой собствен подклас на Order и замених публичния 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();
}
важното извикване (което намерих в оригиналната реализация на класа order) е
criteriaQuery.getColumnsUsingProjection(criteria, getPropertyName());
Което ми даде достъп до псевдонима за колоната, която исках да поръчам при използване на оператора case.
Ако някой друг гледа това, ако поръчвате на свойство, което не е в основния обект, тогава се уверете, че използвате псевдоними във вашите критерии за присъединяване и че след това правите позоваване на тези псевдоними правилно във вашата персонализирана поръчка propertyName, когато инстанцирайте го.