我正在从我的数据库中请求分页和排序的数据,通过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 中说明这一点.怎么做呢?

推荐答案

对于这种情况,您可以使用自定义SQL在MyEntity中创建@Formula列,然后在Pageable中将其作为常规实体字段引用

Java相关问答推荐

Java中不同包中的类之间的配置共享

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

如何才能使我的程序不会要求两次输入?

将带有js文件的 bootstrap 程序导入maven项目时出错

按属性值从流中筛选出重复项

Spring Data JPA慢慢地创建了太多非活动会话

OpenGL ES 3.0-纹理黑色

如何在EXCEL单元格中添加形状和文本

Javadoc在方法摘要中省略方法

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

如何使用路径过渡方法使 node 绕圆旋转?

如何在Java中为thunk创建映射器函数

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

Domino中不同的java.Protocol.handler.pkgs设置在XPages Java中导致错误

在打开搜索结果时,如何让Eclipse打开整个文件?

无法在IntStream上应用Collectors.groupingBy

如何使JOOQ渐变脚本不重新创建表未更改的类?

无泄漏函数的Java DRY

ExecutorService:如果我向Executor提交了太多任务,会发生什么?