Spring Boot 2.7.7中JPA原生查询结合Pageable生成错误SQL
解决Spring Boot 2.7.7原生SQL分页查询的计数SQL语法错误问题
问题原因
使用带nativeQuery = true的Page返回类型查询时,Spring Data JPA自动生成的计数SQL解析逻辑出错,错误地将INNER作为count()的参数,导致PostgreSQL报语法错误。
解决方案
方法1:手动指定计数查询(推荐)
在@Query注解中通过countQuery参数提供正确的计数SQL,完全规避框架自动生成错误语句的问题:
@Query(value = "SELECT * " + "FROM propriedade " + "INNER JOIN proprietario " + " ON proprietario.id = propriedade.proprietario_id " + "WHERE proprietario.nome ILIKE %:proprietario% ", countQuery = "SELECT COUNT(p.id) " + "FROM propriedade p " + "INNER JOIN proprietario pr " + " ON pr.id = p.proprietario_id " + "WHERE pr.nome ILIKE %:proprietario% ", nativeQuery = true ) Page<Propriedade> findByProprietarioLikePage(Pageable pageable, @Param("proprietario") String proprietario);
方法2:明确主表字段选择
将主查询的SELECT *改为明确选择主表的字段(或主表别名),帮助框架正确识别计数对象:
@Query(value = "SELECT p.* " + "FROM propriedade p " + "INNER JOIN proprietario pr " + " ON pr.id = p.proprietario_id " + "WHERE pr.nome ILIKE %:proprietario% ", nativeQuery = true ) Page<Propriedade> findByProprietarioLikePage(Pageable pageable, @Param("proprietario") String proprietario);
补充说明
- 方法1适用于所有复杂查询场景,能完全掌控计数逻辑,避免因框架解析错误导致的问题;
- 方法2通过明确主表别名,让框架自动生成正确的
count(p.id)语句,而非错误的count(INNER); - 计数查询中使用
COUNT(p.id)而非COUNT(*),可避免因JOIN产生重复行导致的计数不准确(前提是主表id为唯一主键)。
内容的提问来源于stack exchange,提问作者beck
相关产品推荐
相关产品推荐

