spring-boot - 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)
解决方案
推荐阅读
- groovy - 是否有某种方法可以对不存在的对象使用安全的 null 运算符?
- firebase - Firebase Cloud Functions 在用户创建时将数据推送到数组
- c# - 多文件模板不能在 WebAPI 项目中使用,但在 classlib C# VisualStudio 2017 中
- javascript - JavaScript 将具有特定结构的对象转换为数组
- c - 使用 pthread 时仍可访问字节
- angular - 在 Angular 5 中,如何避免某些组件/页面拥有 NavMenuComponent?
- r - 将 ann 项添加到 ggplot2 图例
- php - php 7.1 PDO + SQL Server 2014:bindParam 问题
- javascript - 余额金额的 JavaScript 验证
- python - 报告实验室表