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