import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; public class OffsetBasedPageRequest implements Pageable { private int offset; private int limit; private Sort sort; public OffsetBasedPageRequest(int offset, int limit, Sort sort) { this.offset = offset; this.limit = limit; this.sort = sort; } public OffsetBasedPageRequest(int offset, int limit) { this.offset = offset; this.limit = limit; } @Override public int getPageNumber() { return offset / limit; } @Override public int getPageSize() { return limit; } @Override public Pageable next() { return new OffsetBasedPageRequest(offset + limit, limit, sort); } @Override public Pageable previousOrFirst() { if(offset == 0) { return this; } if(offset < limit) { return new OffsetBasedPageRequest(0, offset, sort); } return new OffsetBasedPageRequest(offset - limit, limit, sort); } @Override public Pageable first() { return new OffsetBasedPageRequest(0, limit, sort); } @Override public boolean hasPrevious() { return offset > 0; } @Override public long getOffset() { return offset; } @Override public Sort getSort() { return sort; } }