java - Spring Boot 分页

标签 java spring-boot pagination

我面临分页数据的问题。页面数据是使用外部数组dXPRecommendationResponses 计算的,我希望它应该通过嵌套数组recommendations 计算。我在结果部分提到了响应数据。

我尝试更改页面数据计算,但它是使用我们在 PageImpl() 构造函数中传递的数据来计算的。

我使用这种方法对从第三方 API 获取的数据进行分页。

但它是使用dxpRecommendationslist计算的。

#This is the code through I need to generate the response
List<DXPRecommendationResponse> dxpRecommendationslist = new ArrayList<>();

List<DXPActivity> dxpActivities = getThirdResponse(pageable, correlationId,
dxpRecommendationslist, reservationGuestId, reservationId, nbxRecommendationRequest);

return new PageImpl<>(dxpRecommendationslist, pageable, dxpActivities.size());

#This method is used to get data from third party
public List<DXPActivity> getThirdResponse(final Pageable pageable, final String correlationId,
        List<DXPRecommendationResponse> list, String reservationGuestId, String reservationId,
        NBXRecommendationRequest nbxRecommendationRequest) {

    List<DXPActivity> dxpActivities = new ArrayList<>();

    NBXRecommendationResponse nbxRecommendationResponse = vVNBXRecommendationService
            .getCalendarRecommendation(nbxRecommendationRequest, correlationId);

    if (nbxRecommendationResponse != null) {

        DXPRecommendationResponse dxpRecommendationResponse = new DXPRecommendationResponse();
        dxpRecommendationResponse.setReservationGuestId(reservationGuestId);
        dxpRecommendationResponse.setReservationNumber(reservationId);
        dxpRecommendationResponse.setRecommendationType("CalendarType");
        dxpRecommendationResponse.setDateTime(new Date());

        populateActivities(dxpActivities, nbxRecommendationResponse);
        List<DXPActivity> filteredList;
        if (!CollectionUtils.isEmpty(dxpActivities)
                && dxpActivities.size() >= (pageable.getPageSize() * pageable.getPageNumber())) {

            filteredList = Lists.partition(dxpActivities, pageable.getPageSize()).get(pageable.getPageNumber());
        } else {

            filteredList = new ArrayList<DXPActivity>();
        }
        dxpRecommendationResponse.setRecommendations(filteredList);
        list.add(dxpRecommendationResponse);
    }

    return dxpActivities;
}
#This method is used to populate data
private void populateActivities(List<DXPActivity> dxpActivities,
        NBXRecommendationResponse nbxRecommendationResponse) {

    for (Activity activity :nbxRecommendationResponse.getCalendarRecommendation().getRecommendations().getActivities()) {

        DXPActivity dxpActivity = new DXPActivity();
        orikaMapper.map(activity, dxpActivity);
        dxpActivities.add(dxpActivity);
    }
}

响应数据:

{
    "_embedded": {
        "dXPRecommendationResponses": [
        {
            "recommendationType": "CalendarType",
            "reservationGuestId": "525dab66-1492-4908-a3bf-b5de558368e5",
            "reservationNumber": "3a39f9ad-7e34-4bdb-91eb-b907fd6986c7",
            "dateTime": "2019-08-19T14:38:18.413",
            "recommendations": [
            {
                "productCode": "BIKE2006111000",
                "activityName": "Bimini Bike Tour",
                "recommendationId": "1565948843492_410387839_BIKE2006111000_cal",
                "categoryCode": "DARING",
                "activityStartTime": "2020-06-11T08:30:00.000",
                "activityEndTime": "2020-06-11T11:30:00.000",
                "activityDescription": "Bimini Bike Tour",
                "sequence": 34.0,
                "packageId": 103806,
                "sourceId": "BIMINI BIKE",
                "levelOfActivity": "EASY"
            },
            {
                "productCode": "CUL2006110900",
                "activityName": "Bimini Culinary Tour",
                "recommendationId":"156594884349, 
                "categoryCode": "CULTURED",
                "activityStartTime": "2020-06-11T07:30:00.000",
                "activityEndTime": "2020-06-11T12:30:00.000",
                "activityDescription": "Bimini Culinary Tour",
                "sequence": 29.0,
                "packageId": 103940,
                "sourceId": "BIMINI CUL",
                "levelOfActivity": "MODERATE"
            }
            ]
        }
        ]
    },
    "page": {
        "size": 10,
        "totalElements": 1,
        "totalPages": 1,
        "number": 0
    }
}

最佳答案

这里的问题是 PageImpl 的实现constructor以及如何在此处计算结果总数。下面是从构造函数中获取的代码:

this.total = pageable.toOptional().filter(it -> !content.isEmpty())//
        .filter(it -> it.getOffset() + it.getPageSize() > total)//
        .map(it -> it.getOffset() + content.size())//
        .orElse(total);

这里重要的一行是第二行,如文档注释中所述,它是防止不一致的保险。它检查您是否在最后一页,如果是,它将使用第三行来计算结果 total 。因此完全省略total你给的。如果您想重写此行为,您应该实现您的 Page仅使用给定的 total .

但是,我认为它在语义上不正确。您正在将可能不应该混合的东西混合在一起(一种类型的页面对象,但在另一种类型上完成的实际分页)。作为可分页给出的列表始终有一个元素,而您正在对子元素进行分页,这似乎不正确,是否还需要对子元素进行分页?

可能的解决方案之一是通过指定 Page<DXPActivity> recommendations 使子元素仅可分页。直接里面成员(member)DXPRecommendationResponse并返回不可分页的 DXPRecommendationResponse 。但话又说回来,似乎有点不对劲。这实际上取决于您想要在这里构建什么以及其背后的逻辑是什么。

关于java - Spring Boot 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57567849/

相关文章:

java - 对于非常大的数据集,我应该使用 `HashSet` 还是 `TreeSet`?

java - 将参数数据从 JQuery/Ajax 调用传递到 Jersey Web 服务

java - 在警报对话框中获取用户选择

java - Max for Live 与 JVAP 工具

spring-boot - spring boot分布式事务错误java.lang.ClassNotFoundException : javax. transaction.TransactionManager

spring-boot - 在 Spring Boot 中进行测试时跳过与 mysql 的数据库连接

java - 如何在 Spring MVC 和 Hibernate 应用程序中使用分页

java - 是否可以从 dto 和 User 类创建一个 newUser ?

java - Primefaces数据表延迟加载分页行数显示错误

javascript - Angular 翻译不适用于分页按钮