我通过一些密集的调试解决了这个问题。事实证明,MysqLPagingQueryProvidergetSortKeysWithoutAliases()
在建立要在第一页和后续页运行的SQL查询时使用了一种方法。因此,它附加and (p.id > :_id)
而不是and (p.id > :_p.id)
。稍后,当创建第二个页面排序值并将其存储在JdbcPagingItemReader的startAfterValues
字段中时,它将使用"p.id"
指定的原始String并最终将该对放入命名参数映射中("_p.id",10)
。但是,当读者尝试在查询中填写_id时,它不存在,因为读者使用了非别名删除键。
长话短说,在定义排序键时,我必须删除别名引用。
provider.setSortKeys("p.id": Order.ASCENDING)
必须更改为,才能使所有组件正常工作
provider.setSortKeys("id": Order.ASCENDING)