gpt4 book ai didi

java - 使用 SpringBatch JdbcCursorItemReader 并将 List 作为 NamedParameters

转载 作者:行者123 更新时间:2023-12-02 10:14:16 25 4
gpt4 key购买 nike

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

如果我只是硬编码一个值(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 之一的回应问-当我们传递一个值时,这似乎是有效的。但是,我的问题是传递一个列表而不是参数中的一个值。这就是它似乎失败的地方。

最佳答案

ListPreparedStatementSetter不知道参数类型。如果参数是数组或集合,它将按原样将其设置为第一个占位符,而其他占位符保持不变。因此出现了错误。在您的示例中,如果 List<Long> keys = Arrays.asList(1, 2) ,你的sql语句将是:

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

如果您通过了singletonMapListPreparedStatementSetter ,它将设置 keys 的值(类型为 List )到第一个占位符,就是这样。第二个占位符仍将未设置,并且语句的准备将失败。

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

希望这有帮助。

关于java - 使用 SpringBatch JdbcCursorItemReader 并将 List 作为 NamedParameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54782690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com