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
相关产品推荐
相关产品推荐

