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

使用JdbcTemplate求和时遭遇java.sql.SQLException参数索引越界问题

解决Java SQL参数索引超出范围异常(2 > 参数数量,参数数量为1)

异常原因

你的SQL语句仅包含1个占位符?,但调用jdbcTemplate.queryForList时传入了4个参数(Id、breakfast、lunch、dinner),JDBC尝试为第2个占位符赋值时发现SQL中不存在该占位符,因此抛出参数索引越界异常。此外,你新建的Food food = new Food();是一个空对象,从中获取的属性都是默认值(如int类型的id为0,字符串类型为null),完全不符合业务逻辑。

修正后的代码

@Autowired
JdbcTemplate jdbcTemplate;

public List<Map<String, Object>> amount(int id) {
    // SQL中仅保留一个占位符,对应WHERE条件的id
    String query = " SELECT id, sum(breakfast + lunch + dinner) as amount FROM food WHERE id = ?";
    // 仅传入方法参数中的id,与SQL占位符数量匹配
    return jdbcTemplate.queryForList(query, id);
}

关键说明

  1. 移除无效对象:原代码中新建空Food对象的操作毫无意义,直接使用方法接收的id参数即可。
  2. SQL逻辑修正:sum(breakfast + lunch + dinner)是让数据库对查询到的记录中这三个字段自动求和,不需要将这三个字段作为参数传入SQL,数据库会从表中读取对应字段的值进行计算。
  3. 分组求和补充:如果你的需求是对同一id的多条记录进行分组求和,需要在SQL末尾添加GROUP BY id:
SELECT id, sum(breakfast + lunch + dinner) as amount FROM food WHERE id = ? GROUP BY id

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:30:39