使用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); }
关键说明
- 移除无效对象:原代码中新建空
Food对象的操作毫无意义,直接使用方法接收的id参数即可。 - SQL逻辑修正:
sum(breakfast + lunch + dinner)是让数据库对查询到的记录中这三个字段自动求和,不需要将这三个字段作为参数传入SQL,数据库会从表中读取对应字段的值进行计算。 - 分组求和补充:如果你的需求是对同一id的多条记录进行分组求和,需要在SQL末尾添加
GROUP BY id:
SELECT id, sum(breakfast + lunch + dinner) as amount FROM food WHERE id = ? GROUP BY id
内容的提问来源于stack exchange,提问作者MR Robot
相关产品推荐
相关产品推荐

