-
Notifications
You must be signed in to change notification settings - Fork 369
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add a findAll that takes a Pageable and returns a Slice instead of a Page #558
Comments
So, should we define One option would be to avoid extending any base interface and create additional interfaces that provide this extra functionality:
|
+1 for the additional interfaces |
@vladmihalcea @simasch Can't this be achieved using JpaSpecificationExecutor::findBy method?
I created this gist: https://gist.github.com/josergdev/06c82891a719eca4834410339885ad23 package dev.joserg.jpa;
import static org.springframework.data.domain.ScrollPosition.offset;
import java.util.function.Function;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.ScrollPosition;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.SliceImpl;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Window;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.query.FluentQuery.FetchableFluentQuery;
public interface SliceSpecificationExecutor<T> extends JpaSpecificationExecutor<T> {
default Window<T> findAllWindowed(Specification<T> spec, Sort sort, int limit, ScrollPosition scrollPosition) {
return this.findBy(spec, toWindow(sort, limit, scrollPosition));
}
default Window<T> findAllWindowed(Specification<T> spec, Sort sort, ScrollPosition scrollPosition) {
return this.findBy(spec, toWindow(sort, scrollPosition));
}
default Window<T> findAllWindowed(Specification<T> spec, ScrollPosition scrollPosition) {
return this.findAllWindowed(spec, Sort.unsorted(), scrollPosition);
}
default Slice<T> findAllSliced(Specification<T> spec, Pageable pageable) {
final var window = pageable.isUnpaged()
? this.findAllWindowed(spec, pageable.getSort(), offset())
: this.findAllWindowed(spec, pageable.getSort(), pageable.getPageSize(), this.getInclusiveStartingOffset(pageable));
return new SliceImpl<>(window.getContent(), pageable, window.hasNext());
}
private ScrollPosition getInclusiveStartingOffset(Pageable pageable) {
return pageable.getOffset() == 0
? ScrollPosition.offset()
: offset(pageable.getOffset() - 1);
}
private static <T> Function<FetchableFluentQuery<T>, Window<T>> toWindow(Sort sort, int limit, ScrollPosition scrollPosition) {
return fetchableFluentQuery -> fetchableFluentQuery.sortBy(sort).limit(limit).scroll(scrollPosition);
}
private static <T> Function<FetchableFluentQuery<T>, Window<T>> toWindow(Sort sort, ScrollPosition scrollPosition) {
return fetchableFluentQuery -> fetchableFluentQuery.sortBy(sort).scroll(scrollPosition);
}
} EDIT:
|
@josergdev Thanks for the tip. |
Is this done? |
@abuzar-aftab Be the change you want to see in this world and provide a Pull Request with the fix. |
The
PagingAndSortingRepository
has aPage<T> findAll(Pageable pageable)
method.The problem is that returning a
Page
will result in a count and a select statement.The same problem is present in
JpaSpecificationExecutor
. So it would be awesome to have this covered as well.The text was updated successfully, but these errors were encountered: