Как реализовать разбиение на страницы в spring загрузке с спящим режимом

Я использую spring загрузку с спящим режимом, и я хочу использовать разбиение на страницы в моем проекте. Я искал в 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

Просьба предложить.

Ответ 1

Проверьте это. Ваш контроллер

@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";
}

Ответ 2

Я хотел бы использовать 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.

Ответ 3

Реализовать нумерацию страниц в Spring Boot довольно просто, нужно лишь выполнить основные шаги:

1 - расширяет PagingAndSortingRepository в интерфейсе репозитория

public interface UserRepository extends PagingAndSortingRepository <User, Long> 

2 - Объявление метода должно быть как в примере ниже

Page<User> userList(Pageable pageable);

3 - Реализация метода в классе Service должна быть похожа на приведенный ниже пример

@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";
}

От внешнего вызова должен быть как ниже

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

Для более подробной информации смотрите ниже видео

Spring Boot: нумерация страниц

Spring Boot: расширенная нумерация страниц

Спасибо за прочтение

Ответ 4

Как реализовать динамическое разбиение на страницы с помощью собственного запроса

Здесь вы можете найти уровни хранилища и службы и ваш объект передачи данных (DTO), который будет использоваться для отображения нашего результата и отправки его на уровень контроллера.

public interface CustomSomethingRepository {
    List<Something> findPagedResultBySomethingElseId(long somethingElseId, int offset, int limit);
}

public class SomethingRepositoryImpl implements CustomSomethingRepository {
    @Autowired
    private EntityManager em;

    @SuppressWarnings("unchecked")
    @Override
    public List<Something> findPagedResultBySomethingElseId(long somethingElseId, int offset, int limit) {
        String query = "select s.* from Something s "
                + "join somethingelse selse on selse.id = s.fk_somethingelse "
                + "where selse.id = :somethingElseId "
                + "order by selse.date";
        Query nativeQuery = em.createNativeQuery(query);
        nativeQuery.setParameter("somethingElseId", somethingElseId);
        //Paginering
        nativeQuery.setFirstResult(offset);
        nativeQuery.setMaxResults(limit);
        final List<Object[]> resultList = nativeQuery.getResultList();
        List<Something> somethingList = Lists.newArrayList();
        resultList.forEach(object -> somethingList.add(//map obj to something));
        return somethingList;
    }
}