Spring JPA原生查询使用WITH语句时Pageable页长小于结果总数报错
问题根因
当返回值为Page类型时,Spring Data JPA默认会自动为原生SQL生成统计总条数的count查询,该生成逻辑仅适配普通SELECT语句,无法正确处理以WITH开头的CTE语法:
- 自动生成逻辑会错误地在你的原SQL前拼接
SELECT count(*) FROM,最终生成非法语句:SELECT count(*) FROM WITH result AS (<ton of code>) SELECT * FROM result,刚好触发FROM关键字附近的语法错误 - pageSize设为3时未报错,是因为你的总数据只有2条,单页可以容纳全部结果,部分JPA版本会在该场景下跳过count查询执行,因此没有暴露语法问题
解决方案
在@Query注解中手动指定合法的count查询语句,覆盖默认的自动生成逻辑即可,修改后的Repository层代码如下:
// 原业务查询语句保持不变 String QRY_DATA = "WITH result AS (<ton of code>) SELECT * FROM result"; // 新增手动定义的count查询,CTE部分和原查询完全一致,仅将返回字段改为count(*) String QRY_COUNT = "WITH result AS (<ton of code>) SELECT count(*) FROM result"; @Query(nativeQuery = true, value = QRY_DATA, countQuery = QRY_COUNT) Page<IBusinessDataDto> getData(UUID userId, Pageable pageable);
修改完成后重新测试,pageSize小于总数据量的场景下也不会再抛出语法错误。
内容的提问来源于stack exchange,提问作者Mankind1023
相关产品推荐
相关产品推荐

