使用非数据库字段的条件 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);
我正在使用 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);