Spring Data Pagination с очень индивидуальной сортировкой - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь реализовать бесконечную прокрутку в своем приложении с использованием механизма разбиения данных на пружины.

В моем приложении есть объект, похожий на событие, назовем его Event, и у него есть свойство date.

У пользователя есть события. У него есть некоторые события, которые произойдут в будущем, некоторые из которых уже истекли, и, кроме того, у каждого пользователя есть одно уникальное событие «по умолчанию», которое не имеет даты - оно представлено как нулевое в БД.

В моем приложении мне нужно отобразить события в двух разделах:

а) активные события - события, которые произойдут в будущем + событие по умолчанию

б) истекшие события - события, дата которых уже в прошлом.

До сих пор это работало так, что я запрашивал все события для пользователя из БД, а затем, имея все из них, я применял бы пользовательскую сортировку в клиентском приложении:

а) активные события должны быть отсортированы в порядке возрастания - сначала те, которые ближе всего к сегодняшнему дню, а затем более новые. Событие «null» переходит в конец этого списка.

b) прошедшие события должны быть отсортированы в порядке убывания - сначала те, которые ближе всего к сегодняшнему дню, а затем более старые.

Есть ли способ, которым я могу добиться этого, не разделяя два вызова, чтобы я разбил на страницы результаты, которые сортируются таким образом?

Я понимаю, что это может быть слишком сложно, и я прошу прощения за это.

Заранее спасибо, Приветствия

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете создать пользовательский PageImpl<T> в Spring и добавить в него свой соответствующий список данных.

public Page<EventEntity> getEvents(Pageable pageable){
    long pageSize = 30l;
    // Sort this in ASC while querying from DB
    List<EventEntity> list1 = eventRepository.findByEventType(EventType.active);
    List<EventEntity> list2 = eventRepository.findByEventType(EventType.default);
    // Sort this in DESC while querying from DB
    List<EventEntity> list3 = eventRepository.findByEventType(EventType.expired);

    // Add all the data into a final List
    List<EventEntity> finalList = new ArrayList<EventEntity>();
    finalList.addAll(list1);
    finalList.addAll(list2);
    finalList.addAll(list3);
    return new PageImpl<>(finalList, pageable, pageSize);
}
...