You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:45:03