gpt4 book ai didi

java - 带有 sortKeys 和参数值的 Spring Batch Paging

转载 作者:行者123 更新时间:2023-11-29 02:58:50 24 4
gpt4 key购买 nike

我有一个在 Spring Boot 中运行的 Spring Batch 项目,它运行良好。对于我的读者,我将 JdbcPagingItemReader 与 MySqlPagingQueryProvider 一起使用。

@Bean
public ItemReader<Person> reader(DataSource dataSource) {
MySqlPagingQueryProvider provider = new MySqlPagingQueryProvider()
provider.setSelectClause(ScoringConstants.SCORING_SELECT_STATEMENT)
provider.setFromClause(ScoringConstants.SCORING_FROM_CLAUSE)
provider.setSortKeys("p.id": Order.ASCENDING)

JdbcPagingItemReader<Person> reader = new JdbcPagingItemReader<Person>()
reader.setRowMapper(new PersonRowMapper())
reader.setDataSource(dataSource)
reader.setQueryProvider(provider)
//Setting these caused the exception
reader.setParameterValues(
startDate: new Date() - 31,
endDate: new Date()
)
reader.afterPropertiesSet()
return reader
}

但是,当我使用一些命名参数修改我的查询以替换以前硬编码的日期值并在读取器上设置这些参数值时,如上所示,我在读取的第二个页面上出现以下异常(第一页工作正常,因为分页查询提供程序尚未使用 _id 参数):

org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter '_id': No value registered for key '_id'
at org.springframework.jdbc.core.namedparam.NamedParameterUtils.buildValueArray(NamedParameterUtils.java:336)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.getPreparedStatementCreator(NamedParameterJdbcTemplate.java:374)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:192)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:199)
at org.springframework.batch.item.database.JdbcPagingItemReader.doReadPage(JdbcPagingItemReader.java:218)
at org.springframework.batch.item.database.AbstractPagingItemReader.doRead(AbstractPagingItemReader.java:108)

这里是一个SQL的例子,默认没有WHERE子句。阅读第二页时会自动创建一个:

select *, (select id from family f where date_created between :startDate and :endDate and f.creator_id = p.id)  from person p

在第二页,sql被修改为以下,但是似乎没有提供_id的命名参数:

select *, (select id from family f where date_created between :startDate and :endDate and f.creator_id = p.id) from person p WHERE id > :_id

我想知道我是否不能将 MySqlPagingQueryProvider 排序键与 JdbcPagingItemReader 中设置的其他命名参数一起使用。如果不是,解决这个问题的最佳选择是什么?我需要能够为查询提供参数并对其进行分页(相对于使用游标)。谢谢!

最佳答案

我通过一些激烈的调试解决了这个问题。事实证明,MySqlPagingQueryProvider 在构建 SQL 查询以针对第一页和后续页面运行时使用方法 getSortKeysWithoutAliases()。因此它附加 and (p.id > :_id) 而不是 and (p.id > :_p.id)。稍后,当创建第二页排序值并将其存储在 JdbcPagingItemReader 的 startAfterValues 字段中时,它将使用指定的原始 "p.id" 字符串,并最终放入命名参数中映射 ("_p.id",10) 对。但是,当读者尝试在查询中填写 _id 时,它不存在,因为读者使用了非别名删除键。

长话短说,我必须在定义排序键时删除别名引用。

provider.setSortKeys("p.id": Order.ASCENDING)

必须更改为才能使所有内容很好地协同工作

provider.setSortKeys("id": Order.ASCENDING)

关于java - 带有 sortKeys 和参数值的 Spring Batch Paging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27049742/

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