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

Spring Boot 3升级后JPARepository分页查询PostgreSQL报错

问题分析与解决方案

问题根源

这个问题是Hibernate 6.x(Spring Boot 3默认集成的版本)与PostgreSQL方言的分页参数绑定逻辑不兼容导致的,不属于PostgreSQL数据库本身的问题,也不是Spring Boot核心框架的问题,而是Hibernate作为JPA实现层在处理分页参数时的适配bug。

Spring Boot 3升级后,Hibernate 6对JPQL的参数解析、分页SQL生成逻辑做了重构,在PostgreSQL环境下,自动生成的分页SQL可能出现参数顺序错位,导致报错提示$3位置语法错误(实际是该占位符对应的参数未正确绑定)。而MariaDB的方言处理逻辑不受这个重构影响,所以能正常运行;直接执行生成的SQL语句正常,是因为手动执行时参数是按正确顺序传入的,而Hibernate绑定参数时顺序乱了。

解决方案

1. 显式指定计数查询

Spring Data JPA处理分页时会自动生成count查询来获取总条数,自动生成的count查询可能存在参数绑定问题。显式指定countQuery可以避免这个问题:

@Query(value = "select a from Author a where lower(a.fullName) like (:fullName)",
       countQuery = "select count(a) from Author a where lower(a.fullName) like (:fullName)")
Page<Author> findByLowerFullName(@Param("fullName") String fullName, Pageable pageable);

2. 指定正确的PostgreSQL方言

确保application配置中指定了适配当前PostgreSQL版本的Hibernate方言,避免默认方言的适配问题:

# application.properties
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL15Dialect

根据你的PostgreSQL版本选择对应的方言,比如PostgreSQL10Dialect、PostgreSQL12Dialect等。

3. 检查参数格式(可选)

虽然不是语法错误的直接原因,但确认调用方法时传入的fullName参数包含通配符%,比如"%john%",否则查询结果可能不符合预期:

// 调用示例
authorRepository.findByLowerFullName("%john%", PageRequest.of(0, 10));

内容的提问来源于stack exchange,提问作者perrirrep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:20:37