Почему нумерация страниц перескакивает на размер страницы?

#spring-boot #hibernate #spring-data-jpa #pagination

#весенняя загрузка #спящий режим #spring-data-jpa #разбивка на страницы

Вопрос:

Я создал цикл для получения результатов в разбивке на страницы. Но программа всегда пропускает размер страницы. Например, если размер страницы равен двум, а данные [1,2,3,4,5,6,7], я получаю [1,2], затем [5,6] . [3,4] теряется. Почему это так?

 @Override
@Transactional
public void reprocessMultipleTransactions(List<Long> txnEntryIds) {
    loggerReprocess.info("Multiple transaction :{}", txnEntryIds);
    Pageable pageRequest = new PageRequest(0, 10);
    Page<TransactionEntry> transactionEntry = transactionEntryService.findByTransactionEntryIdsWithLock(txnEntryIds, pageRequest);
    while(!transactionEntry.getContent().isEmpty()){
        pageRequest = pageRequest.next();
        transactionEntryService.saveTxnEntries(transactionEntry.getContent());
        transactionEntry = transactionEntryService.findByTransactionEntryIdsWithLock(txnEntryIds, pageRequest);
    }
}
  

Функция выглядит так:

     @Override
public Page<TransactionEntry> findByTransactionEntryIdsWithLock(List<Long> txnEntryIds, Pageable page) {
    Page<TransactionEntry> transactionEntryPage = bankTransactionEntryRepository.findByIdsWithLock(txnEntryIds, DateTimeUtil.subtractTimeInMinutes(fixedDelayInMinutes), page);
    log.info("TXN ENTRY:{}", transactionEntryPage.getContent().stream()
    .map(TransactionEntry::getId)
    .collect(Collectors.toList()));
    if(Objects.nonNull(TransactionEntryPage.getContent()) amp;amp; TransactionEntryPage.hasContent()){
        List<Long> ids =  transactionEntryPage.getContent()
                .stream()
                .map(TransactionEntry::getId)
                .collect(Collectors.toList());
        log.info("Reprocess: transaction enry ids :{}", ids);
        transactionEntryRepository.saveLastModifiedDate(ids, new Date());
    }
    return  transactionEntryPage;
}
  

Ниже приведен журнал, который я получаю:

 Reprocess - Multiple transaction :[103434523, 103434524, 103434525, 103434527, 103434569, 103434570, 103434571, 103434572, 103434573, 103434574, 103434575, 103434596, 103434602, 103434606, 103434607, 103434610, 103434611, 103434613, 103434620, 103434644, 103434646, 103434659, 103434666, 103434670, 103434676, 103434697, 103434699, 103434700, 103434703, 103434705, 103434706, 103434712, 103434713, 103434718, 103434720, 103434724, 103434768, 103434769, 103434778, 103434784, 103434785, 103434786, 103434792, 103434794, 103434795, 103434798, 103434800, 103434821, 103434823, 103434858, 103434859, 103434869, 103434872, 103434878, 103434882, 103434887, 103434888, 103434891, 103434915, 103434916]
10:00:00.304 [task-scheduler-2] INFO  c.e.s.t.t.b.TransactionEntryServiceImpl - TXN ENTRY:[103434523, 103434524, 103434525, 103434527, 103434569, 103434570, 103434571, 103434572, 103434573, 103434574]
10:00:00.305 [task-scheduler-2] INFO  c.e.s.t.t.b.TransactionEntryServiceImpl - Reprocess:  transaction enry ids :[103434523, 103434524, 103434525, 103434527, 103434569, 103434570, 103434571, 103434572, 103434573, 103434574]
10:00:00.429 [task-scheduler-2] INFO  c.e.s.t.t.b.TransactionEntryServiceImpl - TXN ENTRY:[103434646, 103434659, 103434666, 103434670, 103434676, 103434697, 103434699, 103434700, 103434703, 103434705]
10:00:00.429 [task-scheduler-2] INFO  c.e.s.t.t.b.TransactionEntryServiceImpl - Reprocess:  transaction enry ids :[103434646, 103434659, 103434666, 103434670, 103434676, 103434697, 103434699, 103434700, 103434703, 103434705]
10:00:00.546 [task-scheduler-2] INFO  c.e.s.t.t.b.TransactionEntryServiceImpl - TXN ENTRY:[103434785, 103434786, 103434792, 103434794, 103434795, 103434798, 103434800, 103434821, 103434823, 103434858]
10:00:00.546 [task-scheduler-2] INFO  c.e.s.t.t.b.TransactionEntryServiceImpl - Reprocess:  transaction enry ids :[103434785, 103434786, 103434792, 103434794, 103434795, 103434798, 103434800, 103434821, 103434823, 103434858]
  

Комментарии:

1. Могу ли я узнать причину, по которой вы все усложняете. Почему бы вам не получить всю необходимую транзакцию за один раз, вызвав PageRequest = new PageRequest(0, целое число. MAX_VALUE); какая-либо конкретная причина для извлечения его постранично, а затем с использованием цикла while?

2. Я не хочу блокировать все данные.

3. Вы имеете в виду, что хотите получить все записи за один раз, чтобы избежать блокировки таблицы?

4. да, сэр. Я хотел не блокировать всю таблицу