복붙노트

[SPRING] OFFSET 봄 데이터 Pageable를하고 LIMIT /

SPRING

OFFSET 봄 데이터 Pageable를하고 LIMIT /

나는 봄 데이터에 대한 우리의 전통 JPA / DAO 솔루션을 마이그레이션 할 찾고 있어요.

그러나, 우리의 프론트 엔드 중 하나는 SmartGWT이며, 점진적으로 / 제한을 사용하여 데이터 바인딩 구성 요소로드 데이터는 하드 Pageable의를 사용할 수 있도록 만 오프셋.

이 오프셋 (offset) 제한 / 페이지 번호로 evently 번역 될 수 있다는 것을 확실하지이기 때문에이 문제가 발생합니다. (이것은 사용자가 스크롤은 화면 크기를 조정하는 방법 등에 따라 달라질 수 있음).

나는 등 슬라이스 보았다하지만 / 어디 오프셋 값 한계를 사용하는 방법을 찾을 수 없습니다.

누군가가 어떤 포인터가 있는지 궁금 해서요? 최적의 I / 제한을 계속 사용 오프셋하지만, 구현을 코딩 할 필요없이 내 저장소 인터페이스에서 사용하고 난 지금 수동처럼 그들을 설정하려는 (등 query.setMaxResults)

편집 : 내가 문제가 이유를 명확히하기 위해 - 초기 및 후속 데이터 사이에 다를 수 있습니다 오프셋 한계가 / smartgwt 요소에서 가져옵니다. listgrid 들어, 첫 번째는 해당 화면에 표시 행의 양이기 때문에, 제한은 예를 들면 89로 설정되어 있습니다 페치 0.에게 다음 요청을 상쇄하지만, 89 오프셋 될 수도 있고, 그 요소의 "datapagesize 이후 50 한정 "50 값은, 그래서 내가 아래로 스크롤 할 때 그것이 가져올 수있는 내용. 내가 해제하기 전에 지금까지 아래로 스크롤 경우, 설정에 따라, 예를 행 159-209 대신에 대한 가져올 수 있습니다. 기본적으로, 오프셋 않는다는 보장은 아무것도의 배수가된다 없습니다. 그것은 17 오프셋 변환 페이지에 5를 제한하기 어렵다.

해결법

  1. ==============================

    1.Pagebale 구현 한계를 사용하여 페이지 매김을 만들 오프셋 않습니다. 생성자의 페이지 값 AbstractPageRequest 클래스 getOffset 방법에서의 오프셋 값을 생성하는데 사용된다 :

    Pagebale 구현 한계를 사용하여 페이지 매김을 만들 오프셋 않습니다. 생성자의 페이지 값 AbstractPageRequest 클래스 getOffset 방법에서의 오프셋 값을 생성하는데 사용된다 :

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

    만 제한을 사용하고 오프셋 및 믹스에서 페이지 매개 변수를 폐기하려는 경우, 웹 지원, 기본 구성을 재정의에 대해 특히 부분에 스프링 데이터 문서를보십시오. 당신은 제한을 받아 생성자 인수로 오프셋과 표준 PageRequest가 해결 대체하기 위해 자신의 HandlerMethodArgumentResolver을 구현 Pageable를 당신 자신의 구현을 만들 수 있습니다. 빠른 앤 더러운 예 :

    Pageable를 구현 한

    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]);
        }
    
    }
    
  2. ==============================

    2.

    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));
    

    나에게 당신이 원하는 것을 알고하자

  3. from https://stackoverflow.com/questions/30217552/spring-data-pageable-and-limit-offset by cc-by-sa and MIT license