2015-05-13 2 views
1

Я смотрю на миграцию нашего традиционного решения jpa/dao на Spring Data.Данные о весне Pageable и LIMIT/OFFSET

Однако, один из наших интерфейсных модулей - SmartGWT, а их компоненты привязки данных постепенно загружаются с использованием ограничения/смещения, что затрудняет использование Pageable.

Это вызывает проблемы, так как не является уверенным, что ограничение/смещение может быть переведено на номер страницы. (он может отличаться в зависимости от того, как пользователь прокручивает, изменяется размер экрана и т. д.).

Я просмотрел Slice и т. Д., Но не смог найти способ использовать значения предела/смещения в любом месте.

Было интересно, есть ли у кого-нибудь указатели? Оптимально я хотел бы продолжать использовать limit/offset, но использовать их в своих интерфейсах репозитория без необходимости кодирования реализации и установки их вручную, как сейчас (query.setMaxResults и т. Д.)

Редактировать: Чтобы уточнить, почему у меня есть проблемы. Предел/смещение могут отличаться между исходными и последующими выборками данных в компоненте smartgwt. Для listgrid первая выборка может иметь ограничение, установленное, например, на 89, так как это количество строк, видимых на экране, и смещение 0. Следующий запрос, однако, может иметь смещение 89 и ограничение 50, поскольку это «datapagesize» компонента "значение до 50, так что это произойдет, когда я прокручу вниз. Если я отскакиваю далеко вниз до отпускания, он может, в зависимости от настроек, выбрать, например, строки 159-209. В принципе, нет никакой гарантии, что смещение является чем-то кратным. Трудно преобразовать смещение 17, ограничение 5 на страницу.

+1

не ограничивает = размер, а смещение - это просто страница * размер? который используется при реализации Pageableable по умолчанию? – ikumen

+0

Нет, потому что это может измениться. Скажем, у меня есть Listgrid. Логика SmartGWT изначально устанавливает смещение на 0 и достаточно большой предел для загрузки того, что можно увидеть на экране. Это может быть 50, 79, 99 и т. Д.в зависимости от размера экрана, размера браузера и т. д. В следующий раз он будет использовать значение «pagesize», которое, например, может быть 50. Затем, в зависимости от того, как вы прокручиваете, в следующий раз может потребоваться выборка строк 250-300. Моя проблема заключается в том, что я не могу контролировать начальное значение LIMIT, в основном, а также то, что smartgwt решает, что смещение относится к последующим запросам. – Mathias

ответ

6

PageBale implementation dolimit и offset для создания разбивки на страницы. Значение page в конструкторе используется для генерации значения смещения в AbstractPageRequest класса getOffset метода:

public int getOffset() { 
    return this.page * this.size; 
} 

Если вы хотите использовать только limit и offset и отбросить параметр page из смеси, посмотрите на the Spring Data documentation on web support , особенно часть, касающаяся переопределения конфигурации по умолчанию. Вы могли бы создать свою собственную реализацию Pageable, которая принимает limit и offset в качестве аргументов конструктора, а реализация - собственный HandlerMethodArgumentResolver для замены стандартного разрешения PageRequest. Быстрый и грязный пример:

выгружаемой реализация

public class BetterPageRequest implements Pageable { 

    public BetterPageRequest(int limit, int offset){ 
     this.limit = limit; 
     this.offset = offset; 
    } 

    // Other method implementations 

} 

реализация HandlerMethodArgumentResolver

public class BetterPageableResolver implements HandlerMethodArgumentResolver { 

    @Override 
    public boolean supportsParameter(MethodParameter parameter){ 
     return Pageable.class.equals(parameter.getParameterType()); 
    } 

    @Override 
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container, NativeWebRequest request, WebDataBinderFactory factory){ 
     Map<String,String[]> params = request.getParameterMap(); 
     return new BetterPageRequest(params.get('limit')[0], params.get('offset')[0]); 
    } 

} 
+0

Ах, реализовать мою собственную страницу, возможно, что-то я мог попробовать, спасибо! Поскольку LIMIT/OFFSET является базой данных с базой данных, я считаю это немного странным, что он не предлагается готовым. – Mathias

+0

Но ваш код действительно выделяет, почему у меня проблемы со страницей и создал этот вопрос! Что делать, если я получаю запрос со смещением 17 и предел 5, например? – Mathias

+0

Я вижу вашу точку зрения. См. Мой обновленный ответ. – woemler

3
public class OffsetLimitPageable extends PageRequest { 
    private int offset; 
    public OffsetLimitPageable(int offset, int limit){ 
     super(offset,limit); 
     this.offset=offset; 
    } 
    @Override 
    public long getOffset(){ 
     return this.offset; 
    } 
} 

И пример

Page<WashComment> washComments = washCommentRepository.findWashCommentByWashId_CarWashIdOrderByDateDesc(carWash, new OffsetLimitPageable(offsetNumberRepresentation, 
       limitNumberRepresentation > Config.getMaxLimitAmount() ? Config.getMaxLimitAmount() : limitNumberRepresentation)); 

Сообщите мне, если вы хотите

Смежные вопросы