TGViewer
Spring АйО Spring АйО @spring_aio · 10.9K subscribers
Post #911 7.73K
🌱 Некоторые детали реализации Slice Pagination в Spring Data JPA

Spring Data JPA предлагает два подхода к пагинации: Page и Slice. В отличие от Page, Slice не знает общего количества записей, но всё равно умеет определять, есть ли следующая страница. Как это возможно без COUNT-запроса?

На этот вопрос ответил наш эксперт Михаил Поливаха:

Мы уже как-то писали о том, что в Spring Data есть 2 способа вернуть данные в постраничном виде - Page и Slice. Разница довольно простая - Slice не знает общий размер датасета, который удовлетворяет запросу, а Page знает. Достигается это знание отправкой ещё одного COUNT-запроса в БД.

Однако, несмотря на это, Slice способен ответить на вопрос, есть ли следующая страничка данных:


public interface Slice<T> extends Streamable<T> {

/**
* Returns if there is a next {@link Slice}.
*
* @return if there is a next {@link Slice}.
*/
boolean hasNext();
}


То есть, как минимум, Slice должен понимать, следующая страничка с данными присутствует, при этом не делая "COUNT".

Чтобы реализовать это, Spring Data JPA, например, делает очень простую вещь:

int pageSize = 0;

if (pageable.isPaged()) {
pageSize = pageable.getPageSize();
createQuery.setMaxResults(pageSize + 1);
}

List<Object> resultList = createQuery.getResultList();
boolean hasNext = pageable.isPaged() && resultList.size() > pageSize


То есть, из БД запрашивается не pageSize, а pageSize + 1, то есть чуть-чуть больше. Ну и дальше простое сравнение - если нашли pageSize, то странички дальше точно нет, а если нашли pageSize + 1, то страничка дальше точно есть (хотя может и меньшего размера).

Вот так вот оно работает 😉
  • 🔥 65
  • 👌 12
  • ❤ 8
  • 👎 2
More from @spring_aio
  1. Oct 3, 2026⚡️⚡️Строки кода стремятся подешеветь до цены токена. Что остается ценным? Про это — трек «…
  2. Oct 2, 2026🙅‍♂️ Не каждый AI-вызов должен генерировать текст Иногда от модели нужен не красивый отве…
  3. Oct 1, 2026JEP 544: JVM будет сохранять машинный код между запусками JEP 544 (Ahead-of-Time Code Comp…
  4. Sep 30, 2026🍃 Переписываем всё на Rust, JavaScript — кошмар, AI против Vaadin | Spring АйО Подкаст №7…
  5. Sep 29, 2026⚡️ AI-плагин уже в OpenIDE Pro Вышли новые версии OpenIDE и OpenIDE Pro: AI-плагин теперь…
  6. Sep 28, 2026🧑‍💻 Скрытая возможность конфигурации Spring Boot, о которой мало говорят Представим, что…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →