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

PostgreSQL查询在JdbcTemplate中执行报错:列索引越界

问题修复:JdbcTemplate执行PSQL查询时列索引越界错误

错误原因

你的SQL语句里用了硬编码的经纬度值(-33.859200、151.092804),没有使用占位符?,但调用jdbcTemplate.query()时传入了lon和lat两个参数。JdbcTemplate会尝试在SQL中匹配对应数量的占位符,找不到就会抛出「列索引越界」的错误。

修正后的代码

把SQL里的硬编码坐标替换为占位符,注意参数顺序要和传入的lon、lat对应:

public List<RentalDto> selectRentalsByDistance(Double lon, Double lat) {
        var sql = """                
                SELECT *
                FROM (
                SELECT *, ( 3959 * acos( cos(radians(?)) * cos( radians(latitude) ) * cos( radians(longitude) - radians(?))
                + sin( radians(?)) * sin( radians(latitude) )) ) AS distance
                FROM rental
                ) AS subquery
                WHERE distance < 25
                ORDER BY distance
                LIMIT 30 OFFSET 0
                """;
        // 参数顺序需与SQL中?的顺序完全匹配:lat、lon、lat
        return jdbcTemplate.query(sql, rentalDtoRowMapper, lat, lon, lat);
}

关键说明

  1. 原SQL中两处纬度硬编码值替换为?,对应传入的lat参数
  2. 原SQL中经度硬编码值替换为?,对应传入的lon参数
  3. 调用query方法时,参数顺序必须和SQL里?出现的顺序完全一致,否则会引发参数不匹配问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:51:04