[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-kak-realizovat-paginatsiyu-i-sortirovku-v-spring-data-jpa":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},635,"kak-realizovat-paginatsiyu-i-sortirovku-v-spring-data-jpa",14,"spring","Spring","🌱","Как реализовать пагинацию и сортировку в Spring Data JPA?","Spring Data предоставляет абстракции для пагинации и сортировки через интерфейсы `Pageable`, `Sort`, `Page` и `Slice`.\n\n### Сортировка\n\n```java\nList\u003CUser> users = userRepository.findByStatus(\"ACTIVE\",\n    Sort.by(Sort.Direction.ASC, \"lastName\"));\n\nSort sort = Sort.by(\"lastName\").ascending()\n               .and(Sort.by(\"firstName\").ascending());\n```\n\n### Пагинация\n\n```java\nPageable pageable = PageRequest.of(0, 20, Sort.by(\"lastName\").ascending());\nPage\u003CUser> page = userRepository.findByStatus(\"ACTIVE\", pageable);\n\npage.getContent();          \u002F\u002F List\u003CUser> -- данные текущей страницы\npage.getTotalElements();    \u002F\u002F общее количество элементов\npage.getTotalPages();       \u002F\u002F общее количество страниц\npage.getNumber();           \u002F\u002F номер текущей страницы (с 0)\npage.hasNext();             \u002F\u002F есть ли следующая страница\n```\n\n### Slice vs Page\n\n`Page` выполняет дополнительный `COUNT(*)` для подсчёта общего количества. `Slice` этого не делает -- только знает, есть ли следующая страница. Slice быстрее для больших таблиц.\n\n### Пагинация в контроллере\n\n```java\n@GetMapping\npublic Page\u003CUserDto> getUsers(\n        @RequestParam(defaultValue = \"0\") int page,\n        @RequestParam(defaultValue = \"20\") int size,\n        @RequestParam(defaultValue = \"lastName,asc\") String[] sort) {\n\n    Pageable pageable = PageRequest.of(page, size, Sort.by(\n        Sort.Order.by(sort[0]).with(Sort.Direction.fromString(sort[1]))));\n    return userRepository.findByStatus(\"ACTIVE\", pageable).map(this::toDto);\n}\n```\n\n> **На собеседовании:** покажите понимание разницы Page vs Slice и когда что использовать. Частая ошибка -- загружать все данные в память и делать пагинацию на уровне Java. Также -- не ограничивать максимальный size, позволяя клиенту запросить `size=1000000`.","","junior",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":19,"keywords":20,"schemaAnswer":19,"featuredSnippetReady":21},"Как реализовать пагинацию и сортировку в Spring Data JPA? — Gymterview","Spring Data предоставляет абстракции для пагинации и сортировки через интерфейсы `Pageable`, `Sort`, `Page` и `Slice`.",[7,13],true]