解決策を見つけたと思います。
最後に、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ステートメントを使用して注文したい列のエイリアスにアクセスできました。
他の誰かがこれを見ている場合、ルートオブジェクトにないプロパティを注文する場合は、条件結合でエイリアスを使用し、カスタムのOrderpropertyNameでそれらのエイリアスを正しく参照するようにしてください。インスタンス化します。