Spring批处理JdbcpagingItem读取器在查询未返回数据时引发异常:未为参数编号1设置值



我正在使用jdbcpaginitemreader运行一个春季批处理步骤,该步骤使用任务执行器在多个线程中从SQL server读取数据。当查询返回数据时,批处理运行良好。但如果在最后一次批处理执行后没有创建任何数据,则会引发以下异常。

org.springframework.jdbc.UncategorizedSQLException:PreparedStatementCallback;SQL的未分类SQLException[从BTR_OWNER.ExampleYEE WHERE和created_dttm>=(从BTR_DOWNER.SUMMARY中选择最大值(created_TTM(,其中BATCH_NM="PRING_BATCH"和COMPLETED_STAT="COMPLETED"(and((EMP_SK>?((ORDER BY EMP_SK ASC];SQL状态[null];错误代码[0];没有为参数编号1设置该值。;嵌套异常是com.microsoft.sqlserver.jdbc.SQLServerException:没有为参数号1设置值。

这就是我配置分页项目读取器和步骤的方式:

return new JdbcPagingItemReaderBuilder<BtsEmployeeDTO>().name("BtsEmployeeReader")
.dataSource(jdbcTemplate.getDataSource())
.selectClause(SqlConstants.BTS_EMP_RET_SELECT )
.fromClause(SqlConstants.BTS_EMP_RET_FROM)
.whereClause(SqlConstants.BTS_EMP_RET_WHERE)
.sortKeys(Collections.singletonMap("EMP_SK", Order.ASCENDING))
.fetchSize(10)
.pageSize(10)
.rowMapper(new EmployeeRowMapper()).build();
@Bean
public Step BtsEmployeeRet() { 
return this.stepBuilderFactory.get("BtsEmployeeRet")
.<BtsEmployeeDTO, BtsEmployeeDTO>chunk(10)
.reader(jdbcPagingItemReader())
.writer(getEmpPagingWriter())
.taskExecutor(taskExecutor())
.build();
}

请告知

您在Spring Batch中受到此错误的影响:https://github.com/spring-projects/spring-batch/issues/3898.

自4.3.4和4.2.8版本以来,它已被修复。如果可以的话,你应该升级到4.3.x或4.2.x的最新补丁版本。

如果您真的无法升级,那么应该可以扩展JdbcPagingItemReader并重写方法doReadPage,以包含解决Spring Batch本身问题的修复程序。

最新更新