Как реализовать разбиение на страницы в spring boot с hibernate
Я использую spring boot с hibernate, и я хочу использовать разбиение на страницы в своем проекте. Я искал в google и видел много примеров, но я не могу реализовать его в своем проекте.
Я хочу, как если бы я передал 1 в моем url, то 10 результатов должны прийти, и если я передам 2, то следующие 10 результатов должны прийти и так далее.
моя Дао
@Transactional
public interface PostDao extends CrudRepository<Post, Long>{
@Query(getAllPostsByRank)
List<Post> getAllPostsByRank();
final String getAllPostsByRank= "from Post order by value DESC";
}
вот мой контроллер
@RequestMapping("/top")
@ResponseBody
public List<Post> getAllPosts(HttpServletRequest req, HttpServletResponse res) throws ServletException {
List<Post> postobj = postDao.getAllPostsByRank();
return postobj;
}
и вот мой url:
http://localhost:8888/v1.0/post/top/1
пожалуйста, предложите.
3 ответов
проверяем его. Контроллер
@RequestMapping("/top/pages/{pageno}")
@ResponseBody
public List<Post> getAllPosts(@PathVariable("pageno") int pageno, HttpServletRequest req, HttpServletResponse res) throws ServletException {
List<Post> postobj = postDao.getAllPostsByRank(new PageRequest(pageno,10));
return postobj;
}
ваш dao
@Transactional
public interface PostDao extends CrudRepository<Post, Long>{
@Query(getAllPostsByRank)
List<Post> getAllPostsByRank(Pageable pageable);
final String getAllPostsByRank= "from Post order by value DESC";
}
Я бы рассмотрел использование org.springframework.data.domain.Pageable
сразу в ваш регулятор. Затем этот объект может быть передан вашему слою JPA, где он будет обрабатывать количество возвращаемых результатов и размер.
великая вещь об использовании Pageable
это то, что он возвращает Page
объект, который можно использовать в интерфейсе для формирования логики предыдущей / следующей страницы.
по умолчанию этот класс использует параметры URL 'страница' и 'в размере'; следовательно, page=0 & size=10 вернется первые 10 элементов.
следовательно, в вашем случае код может выглядеть примерно так:
@ResponseBody
@RequestMapping("/top/pages/")
public List<Post> getAllPosts(@PageableDefault(value=10, page=0) Pageable pageable) throws ServletException {
Page page = postDao.findAll(pageable);
return page.getContent();
}
обратите внимание на аннотации @PageableDefault
только настройки по умолчанию, и это не требуется.
в следующем вызове страницы можно <a href="/top/pages?page=1">Next</a>
; это вернет список сообщений от 11 до 20.
реализовать разбиение на страницы в Spring Boot довольно легко, только вам нужно выполнить основные шаги -
1-расширяет PagingAndSortingRepository в интерфейсе репозитория
public interface UserRepository extends PagingAndSortingRepository <User, Long>
2 - объявление метода должно быть похоже на приведенном ниже примере
Page<User> userList(Pageable pageable);
3 - реализация метода в классе обслуживания должна быть похожа на приведенный ниже пример
@Override
public Page<User> userList(Pageable pageable) {
return userRepository.findAll(pageable);
}
4-код класса контроллера должен быть как ниже
@GetMapping("/list")
public String userList(Model model, Pageable pageable) {
Page<User> pages = userService.userList(pageable);
model.addAttribute("number", pages.getNumber());
model.addAttribute("totalPages", pages.getTotalPages());
model.addAttribute("totalElements",
pages.getTotalElements());
model.addAttribute("size", pages.getSize());
model.addAttribute("users", pages.getContent());
return "/user/list";
}
от front-end вызова должно быть как ниже
http://localhost:8080/application/user/list?page=0&size=5
http://localhost:8080/application/user/list?page=1&size=5
http://localhost:8080/application/user/list?page=2&size=5
для более подробной информации смотрите ниже видео
Весенняя Загрузка: Pagination Basic
Spring Boot : Pagination Advanced
Спасибо за внимание