无法在 Spring 引导 NamedParameterJdbcTemplate 中使用 Insert 中的 Subquery 或 Update 进行批量更新
Unable to do batch update with Subquery in Insert or Update in Spring boot NamedParameterJdbcTemplate
我正在尝试使用 NamedParameterJdbcTemplate batchupdate 插入多条记录。无需在 Insert 语句中使用子查询即可插入记录。但是当我使用子查询时它返回 dataintegrityviolationexception
请找到下面的代码供您参考,
public void insertBatch(){
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);
}
在上面的代码中,我使用子查询从公司 table 获取 max(id)。如果我使用这个子查询返回错误。如果我删除并硬编码一些值,它的工作正常。为什么 batchupdate 不接受子查询。我正在使用 DB2 数据库
只支持INSERT INTO ... SELECT ...
形式;不是子查询的 INSERT INTO ... VALUES ...
形式。
INSERT 语句的伪语法是:INSERT INTO EntityName properties_list select_statement.
这样试试:
String sql = "insert into emp(id, name, age) (select max(id) from company where managerid = :managerid), :name, :age";
更新:
正如评论中指出的那样,它应该像这样工作:
String sql = "insert into emp(id, name, age) select max(id), :name, :age from company where managerid = :managerid;
不属于 Select 子查询的额外参数需要合并到 select 子查询中。
我正在尝试使用 NamedParameterJdbcTemplate batchupdate 插入多条记录。无需在 Insert 语句中使用子查询即可插入记录。但是当我使用子查询时它返回 dataintegrityviolationexception
请找到下面的代码供您参考,
public void insertBatch(){
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);
}
在上面的代码中,我使用子查询从公司 table 获取 max(id)。如果我使用这个子查询返回错误。如果我删除并硬编码一些值,它的工作正常。为什么 batchupdate 不接受子查询。我正在使用 DB2 数据库
只支持INSERT INTO ... SELECT ...
形式;不是子查询的 INSERT INTO ... VALUES ...
形式。
INSERT 语句的伪语法是:INSERT INTO EntityName properties_list select_statement.
这样试试:
String sql = "insert into emp(id, name, age) (select max(id) from company where managerid = :managerid), :name, :age";
更新: 正如评论中指出的那样,它应该像这样工作:
String sql = "insert into emp(id, name, age) select max(id), :name, :age from company where managerid = :managerid;
不属于 Select 子查询的额外参数需要合并到 select 子查询中。