【问题标题】:Unable to do batch update with Subquery in Insert or Update in Spring boot NamedParameterJdbcTemplate无法在 Spring Boot NamedParameterJdbcTemplate 中使用插入或更新中的子查询进行批量更新
【发布时间】:2021-06-01 19:01:00
【问题描述】:

我正在尝试使用 NamedParameterJdbcTemplate 批量更新插入多条记录。能够在插入语句中不使用子查询的情况下插入记录。但是当我使用子查询时,它会返回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 数据库

【问题讨论】:

    标签: java spring-boot jdbctemplate named-parameters jdbcnamedparametertemplate


    【解决方案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 子查询中。

    【讨论】:

    • 我试过了。返回 PrepareStatement 调用;错误的 Sql 语法异常
    • 您是否也尝试过删除子查询的括号?或尝试从原始查询中删除 values
    • 我都试过了。面临同样的问题。正在使用 DB2 数据库
    • 我尝试使用 Insert into...select。但无法用逗号分开设置多个值。像插入表(id,name,age)从公司中选择id,:name,:age。在此查询中,选择语句后无法设置值(:name,:age)。
    • 更新了您的回答建议。
    猜你喜欢
    • 2017-12-31
    • 2019-01-18
    • 2013-03-15
    • 2013-12-07
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2016-05-02
    • 2023-03-14
    相关资源
    最近更新 更多