ฉันมีโปรเจ็กต์ Spring Batch ที่ทำงานใน Spring Boot ซึ่งทำงานได้อย่างสมบูรณ์แบบ สำหรับผู้อ่านของฉัน ฉันกำลังใช้ 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 ได้ ถ้าไม่ ทางเลือกที่ดีที่สุดในการแก้ปัญหานี้คืออะไร? ฉันจำเป็นต้องสามารถระบุพารามิเตอร์ให้กับแบบสอบถามและเพจได้ (เทียบกับการใช้เคอร์เซอร์) ขอบคุณ!