我正在从我的数据库中请求分页和排序的数据,通过Pageable
指定,并带有以下存储库API:
org.springframework.data.jpa.repository.JpaSpecificationExecutor.findAll(Specification<MyEntity> filter, Pageable pageable)
Pageable
包含具有简单排序条件的Sort
,例如sort column X in descending order.
有时,Sort
包含一个在基础表中实际上不存在的列,必须用复杂的条件ORDER BY
表达式替换:
ORDER BY CASE WHEN entity_to='CUSTOMER' THEN entity_to_id ELSE (CASE WHEN entity_from='CUSTOMER' THEN entity_from_id END) END
实际上,我可以在Pageable
中重建Sort
实例,这样就可以删除这个不存在的列,但在这种情况下,我没有找到注入复杂ORDER BY
表达式的方法.
我试图找到一种方法,通过调用存储库来丰富查询结果.我希望可以通过添加另外Specification
个过滤器来实现这一点,但我遇到了一个错误(No explicit selection and an implicit one could not be determined
),我不确定order by是否会应用于存储库实现生成的最终查询:
...
filter = filter.and(
(root, query, cb) -> {
final var customerLiteral = cb.literal("CUSTOMER");
final var caseExpression = cb.selectCase(root.get(MyEntity_.ENTITY_TO))
.when(customerLiteral, root.get(MyEntity_.ENTITY_TO_ID)).otherwise(
cb.selectCase(root.get(MyEntity_.ENTITY_FROM))
.when(customerLiteral, root.get(MyEntity_.ENTITY_FROM_ID)).otherwise(0));
final var order = ascElseDesc ? cb.asc(caseExpression) : cb.desc(caseExpression);
final var cq = cb.createQuery(MyEntity.class);
return cb.exists(cq.select(root).orderBy(order).subquery(MyEntity.class));
}
);
repository.findAll(filter, pageable);
我不想放弃利用Spring Data findAll(filter, pageable)
的当前实现.我只想在一个 case 中说明这一点.怎么做呢?