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); }
关键说明
- 原SQL中两处纬度硬编码值替换为
?,对应传入的lat参数 - 原SQL中经度硬编码值替换为
?,对应传入的lon参数 - 调用
query方法时,参数顺序必须和SQL里?出现的顺序完全一致,否则会引发参数不匹配问题
内容的提问来源于stack exchange,提问作者Clippit
相关产品推荐
相关产品推荐

