我正在使用NamedParameterJdbcTemplate,我想使用on conflict sql语句进行批量更新
sql = "INSERT INTO bl_crm_activity_line (guid,hdr_guid) VALUES (:guid, :hdr_guid,)
ON CONFLICT (guid) DO UPDATE SET guid = :guid, hdr_guid = :hdr_guid"
该查询适用于1次插入或更新:
Map<String, Object> m = objectMapper.convertValue(object, Map.class);
jdbcTemplate.update(query, m);
但是当我用该对象的列表进行批量更新时(我试过两种方式):
选项1
Map<String, Object>[] mapsToStore = objsToStore.stream().map(x -> convertObjectToMap(x)).toArray(HashMap[]::new); this.jdbcTemplate.batchUpdate(query, mapsToStore); public Map<String, Object> convertObjectToMap(Object objToStore) { Map<String, Object> m = objectMapper.convertValue(objToStore, Map.class); return m; }
选项2
SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(objectList.toArray()); jdbcTemplate.batchUpdate(query, batch);
选项1和2都会抛出此错误
java.lang.IndexOutOfBoundsException: start 468, end 242, s.length() 470
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:539)
at java.lang.StringBuilder.append(StringBuilder.java:175)
at org.postgresql.core.v3.BatchedQuery.buildNativeSql(BatchedQuery.java:162)
at org.postgresql.core.v3.BatchedQuery.getNativeSql(BatchedQuery.java:84)
at org.postgresql.core.v3.QueryExecutorImpl.sendParse(QueryExecutorImpl.java:1370)
at org.postgresql.core.v3.QueryExecutorImpl.sendOneQuery(QueryExecutorImpl.java:1729)
at org.postgresql.core.v3.QueryExecutorImpl.sendQuery(QueryExecutorImpl.java:1294)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:446)
at org.postgresql.jdbc.PgStatement.executeBatch(PgStatement.java:793)
at org.postgresql.jdbc.PgPreparedStatement.executeBatch(PgPreparedStatement.java:1659)
at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:966)
at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:950)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:662)
at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:950)
at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.executeBatchUpdateWithNamedParameters(NamedParameterBatchUpdateUtils.java:40)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(NamedParameterJdbcTemplate.java:335
不确定我做错了什么。请协助