1

我正在尝试使用 NamedParameterJdbcTemplate batchupdate 插入多条记录。我能够在插入语句中不使用子查询的情况下插入记录。但是当我使用子查询时,它的返回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);
    }

在上面的代码中,我使用子查询从公司表中获取 max(id)。如果我使用这个子查询,它会返回错误。如果我删除并硬编码一些价值,它可以正常工作。为什么批处理更新不接受子查询。我正在使用 DB2 数据库

4

1 回答 1

1

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 子查询中合并。

于 2021-03-03T11:09:13.897 回答