首页 > 解决方案 > JdbcTemplate BatchUpdate 不适用于 Springboot 中带有参数的子查询

问题描述

我正在使用 DB2 数据库。我正在尝试使用 NamedParameterJdbcTemplate batchupdate 插入多条记录。能够使用子查询插入记录,而无需在 Insert 语句中使用命名参数。但是当我使用带有命名参数的子查询时,它返回的数据完整性违规异常请找到下面的代码供您参考,

 public void batchTest(){
       String sql = "insert into emp(id, name, age) values ((select max(id) from company where managerid = :managerid), :name, :age)";
       List<Map<String, Object>> batchVales = new ArrayList<Map<String, Object>>();
       batchValues.add(new MapSqlParameterSource().addValue("name", "example").addValue("age", 30).addValue("managerid", 10).getValues());
       SqlParameterSource[] params = SqlParameterSourceUtils.createBatch(batchValues.toArray(new Map[1]));
       jdbcTemplate.batchUpdate(sql, params);
    }

当我使用带有子查询和命名参数的更新查询时,它的工作原理。只有在插入语句中我才面临这个问题。在上面的代码中,我使用子查询从公司表中获取 max(id),并使用 :managerid 作为命名参数。如果我将此子查询与命名参数一起使用,则会返回错误。如果我删除并硬编码一些价值,它可以正常工作。为什么 Jdbctemplate batchupdate 不接受带有命名参数的子查询。 下面的查询正在工作,

Insert into emp(id, name) select id,name from manager where managerid = :managerid

下面不工作

insert into emp(id, name) select id from manager where managerid = :managerid, :name
insert into emp(id, name) (select id from manager where managerid = :managerid), :name
insert into emp(id, name) ((select id from manager where managerid = :managerid), :name)
insert into emp(id, name) values ((select id from manager where managerid = :managerid), :name)

标签: spring-bootjdbcprepared-statementjdbctemplate

解决方案


推荐阅读