7

我有一个接受 PAGE 和 SIZE 参数的现有 REST 服务

/fetchrecords?page=0&size=10

反过来,它创建了一个 Spring Pageable 以与 Spring Repository 一起使用。

Pageable pageRequest = new PageRequest(page, size, Sort.Direction.DESC, "created");

我现在想使用 Vaadin 8 CallbackDataProvider,但是它会产生用于 BackendDataProvider 的 OFFSET 和 LIMIT。

dataProvider = new CallbackDataProvider<MyPojo, Void>(
                    query -> service.fetchrecords(query.getOffset(), query.getLimit()).stream(),
                    query -> service.getCount());

当然,这不会作为 offset != page 起作用,并且根据偏移位置,限制值会根据剩余的记录数而变化。

在不重写其余/服务的情况下,如何正确地从 DataProvider OFFSET 和 LIMIT 转到 PAGE 和 SIZE?

4

2 回答 2

4

我有同样的问题。带有偏移量和限制的 Vaadin 分页比带有页面和页面大小的分页更强大(如在您的 REST 服务和 Spring 类 PageRequest 中)。所以,你的问题的答案是:你不能轻易。如果您可以将 REST 服务参数更改为偏移和限制,那么您可以实现自己的Pageable,例如:

public class Range implements Pageable, Serializable {

    private static final long serialVersionUID = 0L;

    private int limit;
    private long offset;
    private Sort sort;

    public Range(long offset, int limit, Sort sort) {
         ...
    }

    @Override
    public long getOffset() {
        return offset;
    }

    ...

}

我想知道为什么这不是开箱即用的。

另一种选择是将偏移量/限制映射到可能包含所需数据范围的多个页面,然后获取这些页面并仅获取必要的数据。

请注意:这不适用于 Vaadin 通过 Spring Data Neo4j 访问 Neo4j 时请求的最后一页。SDN v5.2.8 将使用以下代码应用“跳过”查询

parameters.put(SKIP, pageable.getPageNumber() * pageable.getPageSize());

使用getPageNumber是一个问题,例如偏移量 100 和限制 23 会导致跳过 92。提交了一个问题

于 2017-08-09T09:13:07.513 回答
0

您可以使用 Spring Data Provider Add-on。

https://vaadin.com/directory/component/spring-data-provider-add-on

于 2019-07-12T08:37:39.387 回答