Acho que encontrei uma solução.
No final, criei minha própria subclasse de Order e substituí o método public 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();
}
a chamada importante (que encontrei na implementação original da classe order) é a
criteriaQuery.getColumnsUsingProjection(criteria, getPropertyName());
O que me deu acesso ao alias da coluna que eu queria ordenar usando a instrução case.
Se mais alguém estiver olhando para isso, se você estiver solicitando em uma propriedade que não está no objeto raiz, certifique-se de usar aliases em suas junções de critérios e, em seguida, fazer referência a esses aliases corretamente no seu pedido personalizado propertyName quando você instanciá-lo.