Spring Data JPA原生@Query分页是否必须配置countQuery参数?
关于原生查询省略countQuery的场景说明
countQuery并非所有原生分页查询都必须配置,Spring Data JPA 2.0及以上版本已经支持原生查询的count语句自动推导,你测试时可以正常运行是自动推导机制生效的结果,仅部分复杂场景需要手动配置该参数。
你提供的示例可正常运行的原因
- 第二个方法返回值为
List类型:Spring Data JPA处理返回List的分页请求时,只会在原SQL末尾拼接limit/offset逻辑完成分页,不需要统计总条数,本身不会触发count查询,自然不需要配置countQuery。 - 第一个方法返回值为
Page类型:框架会自动基于你的原生SQL推导count查询:- 简单单表查询会直接把select后的字段替换为
count(*),剔除排序逻辑生成合法的count语句 - 带
group by的复杂查询会把原查询作为内层子查询,外层套select count(*)生成count语句,只要原SQL符合标准SQL规范,推导的语句就能正常执行
- 简单单表查询会直接把select后的字段替换为
必须手动配置countQuery的场景
- 原生查询包含复杂语法,比如CTE表达式、窗口函数、union结果集合并、数据库特有的非标准语法,框架自动推导的count语句存在语法错误无法执行
- 自动推导的count语句性能极差,比如多层嵌套子查询导致索引失效,可手动编写更精简的count查询优化性能
- 查询存在
distinct、特殊业务过滤逻辑,自动推导的count结果和业务预期的总条数不一致
内容的提问来源于stack exchange,提问作者Ekaterina
相关产品推荐
相关产品推荐

