插入冲突(guid)使用NamedParameterJdbcTemplate进行批量更新不起作用

时间:2017-06-05 09:23:17

标签: java postgresql jdbctemplate upsert batch-updates

我正在使用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

不确定我做错了什么。请协助

0 个答案:

没有答案