From a4510d8a98cc28fb886a65e309c81748a5d6a7f3 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Wed, 22 Oct 2025 10:58:30 +0200 Subject: [PATCH 1/3] 2138-remove-Page-results - Prepare branch --- pom.xml | 2 +- spring-data-jdbc-distribution/pom.xml | 2 +- spring-data-jdbc/pom.xml | 4 ++-- spring-data-r2dbc/pom.xml | 4 ++-- spring-data-relational/pom.xml | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 01115a9d8c..ebc3efaaf6 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-relational-parent - 4.0.0-SNAPSHOT + 4.0.0-2138-remove-Page-results-SNAPSHOT pom Spring Data Relational Parent diff --git a/spring-data-jdbc-distribution/pom.xml b/spring-data-jdbc-distribution/pom.xml index b3c39e64c3..98e4b8c150 100644 --- a/spring-data-jdbc-distribution/pom.xml +++ b/spring-data-jdbc-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 4.0.0-SNAPSHOT + 4.0.0-2138-remove-Page-results-SNAPSHOT ../pom.xml diff --git a/spring-data-jdbc/pom.xml b/spring-data-jdbc/pom.xml index 9fc8266b9e..95184d944e 100644 --- a/spring-data-jdbc/pom.xml +++ b/spring-data-jdbc/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-jdbc - 4.0.0-SNAPSHOT + 4.0.0-2138-remove-Page-results-SNAPSHOT Spring Data JDBC Spring Data module for JDBC repositories. @@ -15,7 +15,7 @@ org.springframework.data spring-data-relational-parent - 4.0.0-SNAPSHOT + 4.0.0-2138-remove-Page-results-SNAPSHOT diff --git a/spring-data-r2dbc/pom.xml b/spring-data-r2dbc/pom.xml index 7cb5f7a108..3441c25582 100644 --- a/spring-data-r2dbc/pom.xml +++ b/spring-data-r2dbc/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-r2dbc - 4.0.0-SNAPSHOT + 4.0.0-2138-remove-Page-results-SNAPSHOT Spring Data R2DBC Spring Data module for R2DBC @@ -15,7 +15,7 @@ org.springframework.data spring-data-relational-parent - 4.0.0-SNAPSHOT + 4.0.0-2138-remove-Page-results-SNAPSHOT diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml index 6fc709727e..7ddb7b307e 100644 --- a/spring-data-relational/pom.xml +++ b/spring-data-relational/pom.xml @@ -6,7 +6,7 @@ 4.0.0 spring-data-relational - 4.0.0-SNAPSHOT + 4.0.0-2138-remove-Page-results-SNAPSHOT Spring Data Relational Spring Data Relational support @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 4.0.0-SNAPSHOT + 4.0.0-2138-remove-Page-results-SNAPSHOT From 8de8895ddabe082d269d5075c59969750ebd5e10 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Wed, 22 Oct 2025 11:05:13 +0200 Subject: [PATCH 2/3] Deprecate methods taking a Query and a Pageable returning a Page. Since both the Query and the Pageable have limit, offset and sorting information, these methods are confusing and the strategy to resolve the conflict is not clear. Existing code using the methods got replaced. Users of these methods should use the various findAll and findBy methods to construct Page objects as desired. Closes #2138 --- .../jdbc/core/JdbcAggregateOperations.java | 4 +++ .../data/jdbc/core/JdbcAggregateTemplate.java | 2 ++ .../FetchableFluentQueryByExample.java | 12 ++++++-- .../support/SimpleJdbcRepository.java | 30 +++++++++++++++++-- .../core/JdbcAggregateOperationsExtensions.kt | 1 + .../JdbcRepositoryIntegrationTests.java | 4 ++- .../SimpleJdbcRepositoryEventsUnitTests.java | 3 +- 7 files changed, 49 insertions(+), 7 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateOperations.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateOperations.java index 52113f867e..c30429694f 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateOperations.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateOperations.java @@ -230,7 +230,9 @@ public interface JdbcAggregateOperations { * @param pageable the pagination information. Must not be {@code null}. * @return Guaranteed to be not {@code null}. * @since 2.0 + * @deprecated use a combination of other methods of this class to construct results of type {@link Page}. */ + @Deprecated(since = "4.0") Page findAll(Class domainType, Pageable pageable); /** @@ -275,7 +277,9 @@ public interface JdbcAggregateOperations { * @param pageable can be null. * @return a {@link Page} of entities matching the given {@link Example}. * @since 3.0 + * @deprecated use a combination of other methods of this class to construct results of type {@link Page}. */ + @Deprecated(since = "4.0") Page findAll(Query query, Class domainType, Pageable pageable); /** diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java index a744208cfa..ad078f1ebc 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/JdbcAggregateTemplate.java @@ -359,6 +359,7 @@ public Stream streamAll(Class domainType, Sort sort) { return allStreamable.map(this::triggerAfterConvert); } + @Deprecated @Override public Page findAll(Class domainType, Pageable pageable) { @@ -388,6 +389,7 @@ public Stream streamAll(Query query, Class domainType) { return accessStrategy.streamAll(query, domainType).map(this::triggerAfterConvert); } + @Deprecated @Override public Page findAll(Query query, Class domainType, Pageable pageable) { diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/FetchableFluentQueryByExample.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/FetchableFluentQueryByExample.java index 7b12af8193..f56bc38fd2 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/FetchableFluentQueryByExample.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/FetchableFluentQueryByExample.java @@ -35,6 +35,7 @@ import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.relational.core.query.Query; import org.springframework.data.relational.repository.query.RelationalExampleMapper; +import org.springframework.data.support.PageableExecutionUtils; import org.springframework.util.Assert; /** @@ -126,8 +127,15 @@ public Window scroll(ScrollPosition scrollPosition) { @Override public Page page(Pageable pageable) { - return this.entityOperations.findAll(createQuery(p -> p.with(pageable)), getExampleType(), pageable) - .map(item -> this.getConversionFunction().apply(item)); + Query contentQuery = createQuery(p -> p.with(pageable)); + List content = this.entityOperations.findAll(contentQuery, getExampleType()); + + List result = new ArrayList<>(content.size()); + for (S s : content) { + result.add(getConversionFunction().apply(s)); + } + + return PageableExecutionUtils.getPage(result, pageable, () -> this.entityOperations.count(createQuery(), getExampleType())); } @Override diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/SimpleJdbcRepository.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/SimpleJdbcRepository.java index 585755541d..b64dc32722 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/SimpleJdbcRepository.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/SimpleJdbcRepository.java @@ -27,11 +27,14 @@ import org.springframework.data.jdbc.core.convert.JdbcConverter; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.projection.SpelAwareProxyProjectionFactory; +import org.springframework.data.relational.core.query.CriteriaDefinition; +import org.springframework.data.relational.core.query.Query; import org.springframework.data.relational.repository.query.RelationalExampleMapper; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.query.FluentQuery; import org.springframework.data.repository.query.QueryByExampleExecutor; +import org.springframework.data.support.PageableExecutionUtils; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; @@ -139,7 +142,13 @@ public List findAll(Sort sort) { @Override public Page findAll(Pageable pageable) { - return entityOperations.findAll(entity.getType(), pageable); + + Assert.notNull(pageable, "Pageable must not be null"); + + Query query = applyPageable(Query.query(CriteriaDefinition.empty()), pageable); + List content = entityOperations.findAll(query, entity.getType()); + + return PageableExecutionUtils.getPage(content, pageable, () -> entityOperations.count(entity.getType())); } @Override @@ -172,9 +181,15 @@ public List findAll(Example example, Sort sort) { public Page findAll(Example example, Pageable pageable) { Assert.notNull(example, "Example must not be null"); + Assert.notNull(pageable, "Pageable must not be null"); + + Query mappedQuery = this.exampleMapper.getMappedExample(example); + Query contentQuery = applyPageable(mappedQuery, pageable); + + List content = this.entityOperations.findAll(contentQuery, example.getProbeType()); - return this.entityOperations.findAll(this.exampleMapper.getMappedExample(example), example.getProbeType(), - pageable); + return PageableExecutionUtils.getPage(content, pageable, + () -> this.entityOperations.count(mappedQuery, example.getProbeType())); } @Override @@ -203,4 +218,13 @@ public R findBy(Example example, Function JdbcAggregateOperations.findAll(sort: Sort): List JdbcAggregateOperations.findAll(pageable: Pageable): Page = findAll(T::class.java, pageable) diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java index c5b82f0be1..7dd18feb83 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java @@ -119,6 +119,7 @@ public class JdbcRepositoryIntegrationTests { public static Stream findAllByExamplePageableSource() { + // Pageable pageRequest, int size, int totalPages, List notContains return Stream.of( // Arguments.of(PageRequest.of(0, 3), 3, 34, Arrays.asList("3", "4", "100")), // Arguments.of(PageRequest.of(1, 10), 10, 10, Arrays.asList("9", "20", "30")), // @@ -126,7 +127,8 @@ public static Stream findAllByExamplePageableSource() { Arguments.of(PageRequest.of(33, 3), 1, 34, Collections.emptyList()), // Arguments.of(PageRequest.of(36, 3), 0, 34, Collections.emptyList()), // Arguments.of(PageRequest.of(0, 10000), 100, 1, Collections.emptyList()), // - Arguments.of(PageRequest.of(100, 10000), 0, 1, Collections.emptyList()) // + Arguments.of(PageRequest.of(100, 10000), 0, 1, Collections.emptyList()), // + Arguments.of(Pageable.unpaged(), 100, 1, Collections.emptyList()) // ); } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java index 827d4559a8..5ab44d735b 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java @@ -51,6 +51,7 @@ import org.springframework.data.relational.core.mapping.event.Identifier; import org.springframework.data.relational.core.mapping.event.RelationalEvent; import org.springframework.data.relational.core.mapping.event.WithId; +import org.springframework.data.relational.core.query.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.jdbc.core.JdbcOperations; @@ -264,7 +265,7 @@ void publishesEventsOnFindAllPaged() { DummyEntity entity1 = new DummyEntity(42L); DummyEntity entity2 = new DummyEntity(23L); - doReturn(asList(entity1, entity2)).when(dataAccessStrategy).findAll(any(), any(Pageable.class)); + doReturn(asList(entity1, entity2)).when(dataAccessStrategy).findAll(any(Query.class), any(Class.class)); doReturn(2L).when(dataAccessStrategy).count(any()); repository.findAll(PageRequest.of(0, 20)); From 2e13b124fcca52467f28503d9e9f40ad4879eb5d Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Thu, 23 Oct 2025 13:05:53 +0200 Subject: [PATCH 3/3] Polishing. Use Query.with(Pageable) instead of new method. See #2138 Original pull request #2161 --- .../support/SimpleJdbcRepository.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/SimpleJdbcRepository.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/SimpleJdbcRepository.java index b64dc32722..a76e2621f8 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/SimpleJdbcRepository.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/SimpleJdbcRepository.java @@ -145,7 +145,10 @@ public Page findAll(Pageable pageable) { Assert.notNull(pageable, "Pageable must not be null"); - Query query = applyPageable(Query.query(CriteriaDefinition.empty()), pageable); + Query query1 = Query.query(CriteriaDefinition.empty()); + + + Query query = query1.with(pageable); List content = entityOperations.findAll(query, entity.getType()); return PageableExecutionUtils.getPage(content, pageable, () -> entityOperations.count(entity.getType())); @@ -184,7 +187,9 @@ public Page findAll(Example example, Pageable pageable) { Assert.notNull(pageable, "Pageable must not be null"); Query mappedQuery = this.exampleMapper.getMappedExample(example); - Query contentQuery = applyPageable(mappedQuery, pageable); + + + Query contentQuery = mappedQuery.with(pageable); List content = this.entityOperations.findAll(contentQuery, example.getProbeType()); @@ -219,12 +224,4 @@ public R findBy(Example example, Function