Как реализовать разбиение на страницы в 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

Спасибо за внимание