【发布时间】: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