Преобразование смещения и ограничения CallbackDataProvider в страницу и размер Pageable

У меня есть существующая служба REST, которая принимает параметры PAGE и SIZE.

/fetchrecords?page=0&size=10

что, в свою очередь, создает Spring Pageable для использования с Spring Repository.

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

Теперь я хочу использовать Vaadin 8 CallbackDataProvider, однако он создает OFFSET и LIMIT, которые будут использоваться для BackendDataProvider.

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

Конечно, это не будет работать как смещение! = Page, и предельное значение будет меняться в зависимости от того, сколько записей осталось, в соответствии с положением смещения.

Не переписывая остальное / сервис, как я могу правильно перейти от DataProvider OFFSET и LIMIT к PAGE и SIZE?


person steve    schedule 09.08.2017    source источник
comment
Просто вычтите смещение из предела (это даст вам pageSize), а затем вы можете разделить смещение на pageSize (page)   -  person ByeBye    schedule 09.08.2017
comment
@ByeBye что делать, если смещение не совсем в начале страницы?   -  person Steffen Harbich    schedule 09.08.2017
comment
@ByeBye Vaadin DataProvider всегда будет изменять предел и смещение при прокрутке компонента (сетки), поэтому я подозреваю, что основывать прямую страницу / размер ненадежно.   -  person steve    schedule 09.08.2017


Ответы (2)


У меня такая же проблема. Пейджинг 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;
    }

    ...

}

Интересно, почему это не доступно прямо из коробки.

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

Обратите внимание: это не работает для последней страницы, запрошенной Ваадином при доступе к Neo4j через Spring Data Neo4j. SDN v5.2.8 будет использовать следующий код для применения пропуска к запросу

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

Использование getPageNumber является проблемой, например смещение 100 и ограничение 23 приводят к пропуску 92. Подана проблема.

person Steffen Harbich    schedule 09.08.2017
comment
Вы можете найти полный рабочий пример реализации со страницей здесь - person Morfic; 09.08.2017
comment
@forfic, спасибо. Я наткнулся на Custom Pageable, однако я пытался уйти от модификации моей службы, поскольку все остальное в настоящее время использует Page, Size. Если нет других вариантов, мне придется поддерживать смещение и ограничение в моем api / service. - person steve; 09.08.2017
comment
Как я уже упоминал, другой вариант - отобразить диапазон смещения / ограничения на несколько страниц, извлечь их, а затем взять только те данные, которые вам нужны. Конечно это какая-то трата ресурсов :) - person Steffen Harbich; 10.08.2017

Вы можете использовать надстройку Spring Data Provider.

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

person FranklinTheHeroTurtle    schedule 12.07.2019