Polishing.
Skip Query.setFirstResult(…) if the pagable offset is not zero. See #3242 Original pull request: #3454
This commit is contained in:
@@ -17,6 +17,7 @@ package org.springframework.data.jpa.repository.query;
|
||||
|
||||
import jakarta.persistence.Query;
|
||||
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.query.QueryParameterSetter.ErrorHandling;
|
||||
import org.springframework.data.jpa.support.PageableUtils;
|
||||
import org.springframework.util.Assert;
|
||||
@@ -98,16 +99,19 @@ public class ParameterBinder {
|
||||
|
||||
bind(query, metadata, accessor);
|
||||
|
||||
if (!useJpaForPaging || !parameters.hasLimitingParameters() || accessor.getPageable().isUnpaged()) {
|
||||
Pageable pageable = accessor.getPageable();
|
||||
|
||||
if (!useJpaForPaging || !parameters.hasLimitingParameters() || pageable.isUnpaged()) {
|
||||
return query;
|
||||
}
|
||||
|
||||
// see #3242
|
||||
if (!parameters.hasLimitParameter()) {
|
||||
// offset is meaningless if Limit parameter present
|
||||
query.setFirstResult(PageableUtils.getOffsetAsInteger(accessor.getPageable()));
|
||||
// Apply offset only if it is not 0 (the default).
|
||||
int offset = PageableUtils.getOffsetAsInteger(pageable);
|
||||
if (offset != 0) {
|
||||
query.setFirstResult(offset);
|
||||
}
|
||||
query.setMaxResults(accessor.getPageable().getPageSize());
|
||||
|
||||
query.setMaxResults(pageable.getPageSize());
|
||||
|
||||
return query;
|
||||
}
|
||||
|
||||
@@ -126,37 +126,41 @@ class ParameterBinderUnitTests {
|
||||
verify(query).setParameter(eq(1), eq("foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Test // GH-3242
|
||||
void bindAndPrepareWorksWithPageable() throws Exception {
|
||||
|
||||
Method validWithPageable = SampleRepository.class.getMethod("validWithPageable", String.class, Pageable.class);
|
||||
|
||||
Object[] values = { "foo", Pageable.ofSize(10).withPage(3) };
|
||||
|
||||
bindAndPrepare(validWithPageable, values);
|
||||
verify(query).setParameter(eq(1), eq("foo"));
|
||||
verify(query).setFirstResult(eq(30));
|
||||
verify(query).setMaxResults(eq(10));
|
||||
|
||||
verify(query).setParameter(1, "foo");
|
||||
verify(query).setFirstResult(30);
|
||||
verify(query).setMaxResults(10);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Test // GH-3242
|
||||
void bindWorksWithNullForLimit() throws Exception {
|
||||
|
||||
Method validWithLimit = SampleRepository.class.getMethod("validWithLimit", String.class, Limit.class);
|
||||
|
||||
Object[] values = { "foo", null };
|
||||
|
||||
bind(validWithLimit, values);
|
||||
verify(query).setParameter(eq(1), eq("foo"));
|
||||
|
||||
verify(query).setParameter(1, "foo");
|
||||
verify(query, never()).setFirstResult(anyInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
@Test // GH-3242
|
||||
void bindAndPrepareWorksWithLimit() throws Exception {
|
||||
|
||||
Method validWithLimit = SampleRepository.class.getMethod("validWithLimit", String.class, Limit.class);
|
||||
|
||||
Object[] values = { "foo", Limit.of(10) };
|
||||
|
||||
bindAndPrepare(validWithLimit, values);
|
||||
verify(query).setParameter(eq(1), eq("foo"));
|
||||
verify(query).setMaxResults(eq(10));
|
||||
|
||||
verify(query).setParameter(1, "foo");
|
||||
verify(query).setMaxResults(10);
|
||||
verify(query, never()).setFirstResult(anyInt());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user