具有非常自定义排序功能的Spring数据分页

时间:2018-09-11 18:37:24

标签: database sorting pagination spring-data

我正在尝试使用spring数据分页机制在我的应用程序中实现无限滚动。

在我的应用程序中,我有一个类似于事件的实体,我们将其称为事件,它具有日期属性。

用户有事件。他有一些将来会发生的事件,有些已经过期,并且每个用户还有一个唯一的没有日期的“默认”事件-在数据库中表示为空。

在我的应用中,我需要在两个部分中显示事件:

a)活动事件-将来会发生的事件+默认事件

b)过期事件-日期已经过去的事件。

到目前为止,它的工作方式是我将向数据库请求用户的所有事件,然后在拥有所有事件的情况下,在客户端应用中应用自定义排序:

a)活动事件将按升序排序-首先是最接近今天的事件,然后是较新的事件。 “ null”事件进入此列表的底部。

b)过去的事件将按降序排列-首先是最接近今天的事件,然后是较旧的事件。

有什么方法可以实现而无需将两个调用分开,从而使分页的结果按这种方式排序?

我确实意识到这可能太复杂了,对此我感到抱歉。

预先感谢, 干杯

1 个答案:

答案 0 :(得分:0)

您可以在Spring中创建自定义PageImpl<T>,然后向其中添加各自的数据列表。

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);
}