我有一些SQL数据,我需要在Spring Batch中使用ItemReader访问。我认为JdbcPagingItemReader/PagingQueryProvider将是完美的选择。
我从中选择的表有一个主键,它是三列的组合:INTEGER、VARCHAR和VARCHAR。实际上,对于这个用例,对于给定作业中的每个记录,前两列将是相同的。因此,实际上主键列就好像是一个VARCHAR。
接口定义要求:
@Override
public String generateJumpToItemQuery(int itemIndex, int pageSize) {
}
我必须承认,在这种情况下,我没有发现文档有特别的帮助。它看起来很简洁,而且做了很多假设。这里是关于这个特定方法的说明:
生成将提供跳转到项查询的查询。提供的itemIndex可以位于页面的中间,它将与页面大小一起用于计算前一页的最后一个索引,以便能够检索该行的排序键。
我不喜欢文档假设我知道"跳转到项目查询"是什么而没有定义它。因为…我不!什么是"跳转到项目查询"?我假设这是从范式操作,那里的表是用数字ID排序?或者这与LIMIT子句中的跳过值有关吗?
从所提供的实现中可以很清楚地看出这一点。这是PostgresPagingQueryProvider
:
@Override
public String generateJumpToItemQuery(int itemIndex, int pageSize) {
int page = itemIndex / pageSize;
int offset = (page * pageSize) - 1;
offset = offset<0 ? 0 : offset;
String limitClause = new StringBuilder().append("LIMIT 1 OFFSET ").append(offset).toString();
return SqlPagingQueryUtils.generateLimitJumpToQuery(this, limitClause);
}
所以你是对的,它与LIMIT
子句中的跳过值有关。