Как использовать пагинацию в 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 шт):

Автор решения: Sergey Mitrofanov

А чего вы хотели вызывая .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 взять из полученного запроса.

→ Ссылка