【问题标题】:Using SpringBatch JdbcCursorItemReader with List as NamedParameters使用带有 List 作为 NamedParameters 的 SpringBatch JdbcCursorItemReader
【发布时间】:2019-02-20 09:17:30
【问题描述】:

我正在使用下面的 bean 定义来配置读取器以从 Spring Batch 项目中的数据库表中读取一些数据。它在 SQL 中使用命名参数。我将 A java.util.List 作为参数传递。但是,当它尝试运行 SQL 时,我收到 Invalid Column type 错误。

如果我只是硬编码一个值 (namedParameters.put("keys", "138219"); ) 而不是传递一个列表,它可以工作。

@Bean
public JdbcCursorItemReader<MyDTO> myReader() {
JdbcCursorItemReader<MyDTO> itemReader = new JdbcCursorItemReader<>();
itemReader.setDataSource(myDatasource);
itemReader.setRowMapper(return new RowMapper<MyDTO>() {
    @Override
    public MyDTO mapRow(ResultSet resultSet, int rowNum) throws SQLException {
       return toMyDto(resultSet);
    }
};);


Map<String, Object> namedParameters = new HashMap<>();
List<Long> keys= //Some List
Map<String, List<Long>> singletonMap = Collections.singletonMap("keys", keys);
namedParameters.putAll(singletonMap);

itemReader.setSql(NamedParameterUtils.substituteNamedParameters("SELECT A FROM MYTABLE WHERE KEY IN (:keys)",new MapSqlParameterSource(namedParameters)));

ListPreparedStatementSetter listPreparedStatementSetter = new ListPreparedStatementSetter();
listPreparedStatementSetter.setParameters(
    Arrays.asList(NamedParameterUtils.buildValueArray("SELECT A FROM MYTABLE WHERE KEY IN (:keys)", namedParameters)));

itemReader.setPreparedStatementSetter(listPreparedStatementSetter);
return itemReader;
}

我提到sample code snippet here 作为对questions 之一的回应——当我们传递一个值时,这似乎是有效的。但是,我的问题是在参数中传递一个列表而不是一个值。这就是它似乎失败的地方。

【问题讨论】:

    标签: java spring spring-batch


    【解决方案1】:

    ListPreparedStatementSetter 不知道参数类型。如果参数是数组或集合,它将按原样设置第一个占位符,而其他占位符不设置。因此错误。在你的例子中,如果List&lt;Long&gt; keys = Arrays.asList(1, 2),你的sql语句将是:

    SELECT A FROM MYTABLE WHERE KEY IN (?, ?)
    

    如果您将singletonMap 传递给ListPreparedStatementSetter,它会将keys(类型为List)的值设置为第一个占位符,仅此而已。第二个占位符仍将未设置,语句的准备将失败。

    您可以在将参数传递给ListPreparedStatementSetter 之前展平参数,它应该可以正常工作。我添加了一个示例,其中介绍了如何在将参数传递给准备好的语句设置器here(参见flatten 方法)之前展平参数。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多