Объект Pageable
Используя объект Pageable из Spring Data JPA можно выполнять запросы к базе данных и листать список. Эта реализация была представлена во многих блогах, поэтому я не буду ее перечислять. Вы можете обратиться к ссылке:
https://www.tianmaying.com/tutorial/spring-jpa-page-sort
Но есть ситуация, когда pageable не может постранично отобразить результаты списка запрошенных данных, что практически неизбежно в реальной разработке. Для многих сложных предприятий, для упрощения разработки или по практическим причинам, невозможно достичь требований через sql запрос, он обязательно будет фильтровать запрашиваемые данные списка, и функция постраничной обработки объекта pageable недействительна в это время, смотрите код.
List<Impianto> impiantos = myService.findMyMethod(); // returned 30 objects
Page<Impianto> pageImpianto = new PageImpl<Impianto>(impiantos, pageable, impiantos.size());
Эта реализация не может достичь функции подкачки.
По словам автора Spring Data jpa:
Репозитории Spring Data поддерживают пагинацию в методах запросов, просто объявляя параметр типа Pageable, чтобы убедиться, что они читают только данные, необходимые для запрашиваемой страницы.
Объект pageable является лишь базовой реализацией пагинации и не может обеспечить пагинацию результатов запрошенного списка. На мой взгляд, эта реализация не имеет практически никакого практического инженерного значения. Рекомендуется не использовать объекты pageable для подкачки в реальной разработке проекта. Если у вас есть другое мнение, вы можете оставить сообщение для обсуждения.
По этой причине, если объект pageable хочет добиться пейджинга, он может обрабатывать данные только вручную. Пример кода выглядит следующим образом:
if (pageable.getOffset() > ucShopCourseBizPojoList.size()) {
long total = 0L;
PageImpl<UcShopCourseBizPojo> emptyPage = new PageImpl<>(Lists.newArrayList(), pageable, total);
resultDo.setResult(emptyPage);
return resultDo;
}
if (pageable.getOffset() <= ucShopCourseBizPojoList.size() && pageable.getOffset() + pageable.getPageSize() > ucShopCourseBizPojoList.size()) {
List<UcShopCourseBizPojo> bizPojos = ucShopCourseBizPojoList.subList(pageable.getOffset(), ucShopCourseBizPojoList.size());
PageImpl<UcShopCourseBizPojo> pPage = new PageImpl<>(bizPojos, pageable, ucShopCourseBizPojoList.size());
resultDo.setResult(pPage);
return resultDo;
}
List<UcShopCourseBizPojo> ucShopCourseBizPojos = ucShopCourseBizPojoList.subList(pageable.getOffset(), pageable.getOffset() + pageable.getPageSize());
PageImpl<UcShopCourseBizPojo> pPage = new PageImpl<>(ucShopCourseBizPojos, pageable, ucShopCourseBizPojoList.size());
ucShopCourseBizPojoList — это список, который должен быть постраничным.