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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:26:03