使用非数据库字段的条件 API 对查询结果进行排序

Order query results with Criteria API by something that is NOT a database field

我正在使用 Criteria API 从我的数据库中获取排序数据。 像这样排序很好:

Path<Data> data = // initialize;
String sortField = // initialize name of field to sort by;
Expression<?> sortExpression = data.get(sortField);
criteriaQuery.orderBy(criteriaBuilder.desc(sortExpression));

这样,我就可以按字段内容对结果进行排序。但是我怎样才能通过其他方式订购呢?

在我的示例中,我有一个包含(可为空的)用户 ID 的数据库字段 data.user_id。虽然查询将获取 ID,但我不想按 ID 本身(数值)排序,而是按“ID 为空”、“ID 是我的”、“ID 是别人的”这三个类别进行排序。我可以在我的服务方法中访问“我的”ID,但我该如何排序?

我是这样工作的:

Expression<Long> id = data.get("userId");
Long userId = // ID of logged in user
Expression<?> sortExpression = criteriaBuilder.selectCase()
                        .when(criteriaBuilder.isNull(id), 1)
                        .when(criteriaBuilder.equal(id, userId), 2)
                        .otherwise(3);