Объект Pageable в Spring Data JPA реализует пейджинг опрашиваемого списка

Объект 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 — это список, который должен быть постраничным.

Оцените статью
devanswers.ru
Добавить комментарий