Polishing.

Skip Query.setFirstResult(…) if the pagable offset is not zero.

See #3242
Original pull request: #3454
This commit is contained in:
Mark Paluch
2024-06-27 14:39:41 +02:00
parent 5546153ca6
commit a2f47a5b49
2 changed files with 26 additions and 18 deletions

View File

@@ -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;
}

View File

@@ -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());
}