当我的主键是字符串时,如何在 Spring 批处理中使用 JdbcPagingItemReader?

How do I use JdbcPagingItemReader in Spring Batch when my primary key is a string?

我有一些 SQL 数据需要使用 Spring 批处理中的 ItemReader 访问。我认为 JdbcPagingItemReader / PagingQueryProvider 是最合适的人选。

我从中选择的 table 有一个主键,它是三列的组合:INTEGER、VARCHAR 和 VARCHAR。实际上,对于这个用例,前两列对于给定作业中的每条记录都是相同的。因此,实际上就好像主键列是一个 VARCHAR。

接口定义需要这样:

@Override
public String generateJumpToItemQuery(int itemIndex, int pageSize) {

}

我必须承认,在这种情况下,我发现文档并没有特别的帮助。它看起来相当简洁并且做了很多假设。但这是关于该特定方法的内容:

Generate the query that will provide the jump to item query. The itemIndex provided could be in the middle of the page and together with the page size it will be used to calculate the last index of the preceding page to be able to retrieve the sort key for this row.

我不喜欢文档假设我知道 "jump to item query" 是什么但没有定义它。因为……我不!什么是 "jump to item query"?我假设这是从 table 是用数字 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子句中的跳过值有关。