Skip to content

Commit 133ec27

Browse files
committed
Add support for Limit.
Closes #3052
1 parent 30c32f7 commit 133ec27

File tree

6 files changed

+42
-11
lines changed

6 files changed

+42
-11
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaParameters.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
*/
1616
package org.springframework.data.jpa.repository.query;
1717

18+
import jakarta.persistence.TemporalType;
19+
1820
import java.lang.reflect.Method;
1921
import java.util.Date;
2022
import java.util.List;
2123

22-
import jakarta.persistence.TemporalType;
23-
2424
import org.springframework.core.MethodParameter;
2525
import org.springframework.data.jpa.repository.Temporal;
2626
import org.springframework.data.jpa.repository.query.JpaParameters.JpaParameter;
@@ -60,6 +60,13 @@ protected JpaParameters createFrom(List<JpaParameter> parameters) {
6060
return new JpaParameters(parameters);
6161
}
6262

63+
/**
64+
* @return {@code true} if the method signature declares Limit or Pageable parameters.
65+
*/
66+
public boolean hasLimitingParameters() {
67+
return hasLimitParameter() || hasPageableParameter();
68+
}
69+
6370
/**
6471
* Custom {@link Parameter} implementation adding parameters of type {@link Temporal} to the special ones.
6572
*

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/NamedQuery.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private NamedQuery(JpaQueryMethod method, EntityManager em) {
7979

8080
this.declaredQuery = DeclaredQuery.of(queryString, false);
8181

82-
boolean weNeedToCreateCountQuery = !namedCountQueryIsPresent && method.getParameters().hasPageableParameter();
82+
boolean weNeedToCreateCountQuery = !namedCountQueryIsPresent && method.getParameters().hasLimitingParameters();
8383
boolean cantExtractQuery = !extractor.canExtractQuery();
8484

8585
if (weNeedToCreateCountQuery && cantExtractQuery) {

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ParameterBinder.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ Query bindAndPrepare(Query query, QueryParameterSetter.QueryMetadata metadata,
9696

9797
bind(query, metadata, accessor);
9898

99-
if (!useJpaForPaging || !parameters.hasPageableParameter() || accessor.getPageable().isUnpaged()) {
99+
if (!useJpaForPaging || !parameters.hasLimitingParameters() || accessor.getPageable().isUnpaged()) {
100100
return query;
101101
}
102102

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java

+21
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,14 @@
2929
import org.junit.jupiter.api.extension.ExtendWith;
3030
import org.springframework.beans.factory.annotation.Autowired;
3131
import org.springframework.dao.InvalidDataAccessApiUsageException;
32+
import org.springframework.data.domain.Limit;
3233
import org.springframework.data.domain.Page;
3334
import org.springframework.data.domain.PageRequest;
3435
import org.springframework.data.domain.Pageable;
36+
import org.springframework.data.domain.ScrollPosition;
3537
import org.springframework.data.domain.Slice;
3638
import org.springframework.data.domain.Sort;
39+
import org.springframework.data.domain.Window;
3740
import org.springframework.data.jpa.domain.sample.Role;
3841
import org.springframework.data.jpa.domain.sample.User;
3942
import org.springframework.data.jpa.provider.PersistenceProvider;
@@ -53,6 +56,7 @@
5356
* @author Oliver Gierke
5457
* @author Krzysztof Krason
5558
* @author Greg Turnquist
59+
* @author Mark Paluch
5660
* @see QueryLookupStrategy
5761
*/
5862
@ExtendWith(SpringExtension.class)
@@ -221,6 +225,23 @@ void executesQueryToSliceWithUnpaged() {
221225
assertThat(slice.hasNext()).isFalse();
222226
}
223227

228+
@Test // DATAJPA-94
229+
void executesQueryWithLimitAndScrollPosition() {
230+
231+
Window<User> first = userRepository.findByLastnameOrderByFirstname(Limit.of(1), //
232+
ScrollPosition.offset(), //
233+
"Matthews" //
234+
);
235+
236+
Window<User> next = userRepository.findByLastnameOrderByFirstname(Limit.of(1), //
237+
ScrollPosition.offset(1), //
238+
"Matthews" //
239+
);
240+
241+
assertThat(first).containsExactly(dave);
242+
assertThat(next).containsExactly(oliver);
243+
}
244+
224245
@Test // DATAJPA-830
225246
void executesMethodWithNotContainingOnStringCorrectly() {
226247

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpaQueryMethodUnitTests.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,9 @@
1515
*/
1616
package org.springframework.data.jpa.repository.query;
1717

18-
import static org.assertj.core.api.Assertions.assertThat;
19-
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
20-
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
21-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
22-
import static org.mockito.ArgumentMatchers.any;
23-
import static org.mockito.Mockito.doReturn;
24-
import static org.mockito.Mockito.when;
18+
import static org.assertj.core.api.Assertions.*;
19+
import static org.mockito.ArgumentMatchers.*;
20+
import static org.mockito.Mockito.*;
2521

2622
import jakarta.persistence.LockModeType;
2723
import jakarta.persistence.QueryHint;
@@ -159,13 +155,17 @@ void returnsQueryIfAvailable() throws Exception {
159155
@Test
160156
void rejectsInvalidReturntypeOnPagebleFinder() {
161157

158+
when(metadata.getReturnedDomainClass(any())).thenReturn((Class) User.class);
159+
162160
assertThatIllegalStateException()
163161
.isThrownBy(() -> new JpaQueryMethod(invalidReturnType, metadata, factory, extractor));
164162
}
165163

166164
@Test
167165
void rejectsPageableAndSortInFinderMethod() {
168166

167+
when(metadata.getReturnedDomainClass(any())).thenReturn((Class) User.class);
168+
169169
assertThatIllegalStateException()
170170
.isThrownBy(() -> new JpaQueryMethod(pageableAndSort, metadata, factory, extractor));
171171
}

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Set;
2727
import java.util.stream.Stream;
2828

29+
import org.springframework.data.domain.Limit;
2930
import org.springframework.data.domain.OffsetScrollPosition;
3031
import org.springframework.data.domain.Page;
3132
import org.springframework.data.domain.PageRequest;
@@ -226,6 +227,8 @@ Window<User> findTop3ByFirstnameStartingWithOrderByFirstnameAscEmailAddressAsc(S
226227

227228
Page<User> findByLastnameIgnoringCase(Pageable pageable, String lastname);
228229

230+
Window<User> findByLastnameOrderByFirstname(Limit limit, ScrollPosition scrollPosition, String lastname);
231+
229232
List<User> findByLastnameIgnoringCaseLike(String lastname);
230233

231234
List<User> findByLastnameAndFirstnameAllIgnoringCase(String lastname, String firstname);

0 commit comments

Comments
 (0)