Tôi nghĩ rằng tôi đã tìm thấy một giải pháp.
Cuối cùng, tôi đã tạo lớp con Order của riêng mình và ghi đè phương thức String toSqlString (Criteria, CriteriaQuery) công khai:
@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ệnh gọi quan trọng (mà tôi đã tìm thấy trong triển khai ban đầu của lớp đơn hàng) là
criteriaQuery.getColumnsUsingProjection(criteria, getPropertyName());
Điều này đã cho tôi quyền truy cập vào bí danh cho cột mà tôi muốn sắp xếp khi sử dụng câu lệnh trường hợp.
Nếu bất kỳ ai khác đang nhìn vào điều này, nếu bạn đang đặt hàng trên một thuộc tính không có trên đối tượng gốc, thì hãy đảm bảo rằng bạn sử dụng bí danh trong các phép nối tiêu chí của mình và sau đó bạn tham chiếu chính xác các bí danh đó trong thuộc tính Đặt hàng tùy chỉnh của mình Tên khi bạn khởi tạo nó.