首页 > 解决方案 > Pageable 的自定义实现

问题描述

我需要创建带有分页到数据库的请求的自定义实现。我能够从数据库中获取所有对象的列表并操作该列表。这是 PageableDto 的外观:

public class PageableDto {

    private Integer page;
    private Integer size;
}

这就是返回分页对象列表的函数的实现方式

private List<RequestDto> doPagination(PageableDto pageable, List<RequestDto> requests) {
        List<RequestDto> paginatedList = new ArrayList<>();
        Integer page = pageable.getPage();
        Integer size = pageable.getSize();
        if (page == 0 || page == 1) {
            for (int i = 0 ; i < size ; i++) {
                if (i < requests.size()) {
                    paginatedList.add(requests.get(i));
                } else {
                    return paginatedList;
                }
            }
            return paginatedList;
        }
        int startIndex = size * (page - 1);
        int endIndex = startIndex + size;
        for (int i = startIndex; i < endIndex ; i++) {
            if (i < requests.size()) {
                paginatedList.add(requests.get(i));
            } else {
                return paginatedList;
            }
        }
        return paginatedList;
    } 

我试图让它像真正的 Pageable Spring 对象一样工作,但是实现很糟糕,我得到了意想不到的结果。

例如,如果列表有 10 个条目,页面为 0,大小为 3,我将从列表中获取前三个对象。如果页面为 1 且大小为 3,我将获得条目 4、5、6,依此类推

标签: javaspring

解决方案


请尝试以下代码:

private List<RequestDto> doPagination(PageableDto pageable, List<RequestDto> requests) {
        List<RequestDto> paginatedList;
        Integer page = pageable.getPage();
        Integer size = pageable.getSize();
        int offset = page * size;
        if(requests.size()>offset){
            if(requests.size()>(offset+size)){
                paginatedList = requests.subList(offset, offset+size);
            }else{
                paginatedList = requests.subList(offset, requests.size());
            }
        }else{
            paginatedList = new ArrayList<>();
        }
        return paginatedList;
    }

推荐阅读