Я использую Spring Batch для выполнения миграции данных. данных много, поэтому я решил использовать JdbcPagingItemReader для чтения данных постранично.
Ниже, как я определяю читателя:
private JdbcPagingItemReader<Map<String, Object>> buildItemReader(final DataSource dataSource, String tableName,
String tenant){
String tenantName = tenantHelper.determineTenant(tableName);
Map<String, Object> sqlParameterValues = new HashMap<>();
sqlParameterValues.put("tableName", tableName);
sqlParameterValues.put("tenantName", tenantName);
sqlParameterValues.put("tenant", tenant);
JdbcPagingItemReader<Map<String, Object>> itemReader = new JdbcPagingItemReader<>();
itemReader.setDataSource(dataSource);
itemReader.setPageSize(2);
itemReader.setFetchSize(2);
itemReader.setQueryProvider(generateSqlPagingQueryProvider(tableName,tenantName,tenant));
//itemReader.setParameterValues(sqlParameterValues);
itemReader.setRowMapper(new ColumnMapRowMapper());
try {
itemReader.afterPropertiesSet();
} catch (Exception e) {
e.printStackTrace();
}
return itemReader;
}
private PostgresPagingQueryProvider generateSqlPagingQueryProvider(String tableName, String tenantName,
String tenant) {
PostgresPagingQueryProvider provider = new PostgresPagingQueryProvider();
Map<String, Order> sortKeys = new LinkedHashMap<>();
String sortKey = getSortKeyBytable(tableName);
sortKeys.put(sortKey, Order.ASCENDING);
provider.setSelectClause("select *");
provider.setFromClause("from " + tableName);
provider.setWhereClause("where " + tenantName + " ='" + tenant + "'");
provider.setSortKeys(sortKeys);
return provider;
}
ключ сортировки, который я указал, является первичным ключом в таблице, это строка. Но пейджинг не работает, как ожидалось. Но он не выдает ошибки, он просто читает все данные.
В документе с пакетной пружиной приведен пример, в котором в качестве ключа сортировки используется идентификатор типа int. Интересно, поддерживает ли чтение на странице пакетной пружины только ключевое слово сортировки типа int? И не поддерживает строковый ключ сортировки?
Это ограничение по весне?