Saya memiliki proyek Spring Batch yang berjalan di Spring Boot yang berfungsi dengan baik. Untuk pembaca saya, saya menggunakan JdbcPagingItemReader dengan 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
}
Namun, ketika saya memodifikasi kueri saya dengan beberapa parameter bernama untuk menggantikan nilai tanggal yang dikodekan sebelumnya dan menetapkan nilai parameter ini pada pembaca seperti yang ditunjukkan di atas, saya mendapatkan pengecualian berikut pada halaman kedua yang dibaca (yang pertama halaman berfungsi dengan baik karena parameter _id belum digunakan oleh penyedia kueri paging):
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)
Berikut adalah contoh SQL, yang tidak memiliki klausa WHERE secara default. Seseorang dibuat secara otomatis ketika halaman kedua dibaca:
select *, (select id from family f where date_created between :startDate and :endDate and f.creator_id = p.id) from person p
Pada halaman kedua, sql diubah menjadi berikut, namun tampaknya parameter bernama untuk _id tidak diberikan:
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
Saya ingin tahu apakah saya tidak bisa menggunakan kunci pengurutan MySqlPagingQueryProvider bersama dengan parameter bernama tambahan yang disetel di JdbcPagingItemReader. Jika tidak, apa alternatif terbaik untuk mengatasi masalah ini? Saya harus dapat memberikan parameter ke kueri dan juga halamannya (vs. menggunakan kursor). Terima kasih!