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

Spring @Query原生SQL参数传递失效问题求助

解决Spring Data JPA原生查询参数未绑定问题

针对你遇到的page参数无法被Hibernate识别、SQL始终显示offset ?的问题,可尝试以下几种解决方案:

1. 确认@Param注解的正确导入

确保Repository方法中使用的@Param注解来自Spring Data的包,而非JPA原生包:

// 正确导入
import org.springframework.data.repository.query.Param;

@Query(value = "SELECT * FROM register_log limit 50 offset :page",
        countQuery = "SELECT COUNT(*) FROM register_log ",
        nativeQuery = true)
List<RegisterLog> findRegisterLogsOptimized(@Param("page") int page);

2. 改用位置参数绑定

如果命名参数绑定失效,可尝试使用位置参数(?1代表第一个方法参数):

@Query(value = "SELECT * FROM register_log limit 50 offset ?1",
        countQuery = "SELECT COUNT(*) FROM register_log ",
        nativeQuery = true)
List<RegisterLog> findRegisterLogsOptimized(int page);

3. 修正分页逻辑(额外提示)

注意:当前代码中offset :page直接使用传入的50作为偏移量,这会跳过前50条数据。如果你的需求是按每页50条分页,第N页的偏移量应该是(page - 1)*50,建议在服务层计算后传入:

// 服务层代码调整
public List<RegisterLog> findRegisterLogsOptimized(int pageNum) {
    int offset = (pageNum - 1) * 50;
    return registerLogRepository.findRegisterLogsOptimized(offset);
}

4. 清理缓存并重启应用

有时旧的SQL语句会被Hibernate缓存,导致新的参数绑定逻辑未生效。重启应用或清理Hibernate的二级缓存即可解决。

5. 检查Spring Data JPA版本

如果使用的是较旧的Spring Data JPA版本(如2.x之前),可能存在原生查询参数绑定的BUG,建议升级到稳定的新版本(如2.7.x或更高)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:01:39