无法在 Spring 启动 NamedParameterJdbcTemplate 中使用插入或更新中的子查询进行批量更新

问题描述

我正在尝试使用 NamedParameterJdbcTemplate 批量更新插入多条记录。能够在不使用 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);
    }

在上面的代码中,我使用子查询从公司表中获取 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,age) select max(id),:age from company where managerid = :managerid;

不属于 Select 子查询的额外参数需要合并到 select 子查询中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...