Как использовать пагинацию в Spring boot, если логика сортировки выделена в отдельный метод?
Разрабатываю приложение, которое парсит данные арбитражных управляющих с сайта ЕФРСБ. Когда я отображаю данные во view я использую пагинацию. Без сортировки это сделать очень просто, надо всего лишь модифицировать метод findAll(), который должен принимать параметр Pageable.
public interface ArbitrManagerRepository extends JpaRepository<ArbitrManager, Long> {
Page<ArbitrManager> findAll(Pageable pageable);
}
Потом просто эти данные нужно отобразить. Также я сортирую арбитражных управляющих по количеству сообщений и по ФИО. Метод сортировки
public Page<ArbitrManager> getAll(String sortedType, String searchWord, Pageable pageable) {
List<ArbitrManager> arbitrManagers;
List<ArbitrManager> arbitrManagersFromDb;
if (searchWord.equals("")) arbitrManagersFromDb = arbitrManagerRepository.findAll();
else arbitrManagersFromDb = searchByFullName(arbitrManagerRepository.findAll(), searchWord);
switch (sortedType) {
case "msg-high-to-low":
arbitrManagers = sortedByNumberOfMessages(arbitrManagersFromDb,
"high-to-low");
break;
case "msg-low-to-high":
arbitrManagers = sortedByNumberOfMessages(arbitrManagersFromDb,
"low-to-high");
break;
default:
return arbitrManagerRepository.findAll(pageable);
}
Page<ArbitrManager> arbitrManagerPage = new PageImpl<>(arbitrManagers, pageable, arbitrManagers.size());
return arbitrManagerPage;
}
Когда я сортирую список, то мне нужно преобразовать его в Page<>, передать параметр Pageable и всё должно заработать. Но при попытки такой сортировке пагинация не работает и вместо 10 объектов выводиться все отсортированные данные. ArbitrManagerController
@Controller
@RequiredArgsConstructor
public class ArbitrManagerController {
private final ArbitrManagerService arbitrManagerService;
@GetMapping("/")
public String arbitrManagers(
@RequestParam(name = "sortedType", required = false, defaultValue = "") String sortedType,
@RequestParam(name = "searchWord", required = false, defaultValue = "") String searchWord,
Model model, @PageableDefault(sort = { "id" }, direction = Sort.Direction.DESC) Pageable pageable) {
model.addAttribute("searchWord", searchWord);
model.addAttribute("sortedType", sortedType);
model.addAttribute("page", arbitrManagerService.getAll(sortedType, searchWord, pageable));
model.addAttribute("url", arbitrManagerService.getCurrentUrl(sortedType, searchWord));
return "arbitr-managers";
}
}
Ответы (1 шт):
А чего вы хотели вызывая .findAll()?
Pageable уже содержит в себе нужные заклинания для сортировки. Почитать можно например тут https://easyjava.ru/spring/spring-data-project/sortirovka-i-paginaciya/
Так как вы завязались на собственный запрос о сортировке через sortedType, то необходимо просто добавить в pageable нужные заклинания.
"msg-high-to-low" -> Pageable page = new PageRequest(X, Y, SortDirection.Desc, searchWord)
А X и Y взять из полученного запроса.