From d194b7d4e0e1e1ea897258114eaf276effd523ed Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 23 Oct 2025 13:50:26 +0200 Subject: [PATCH] Polishing. Refine deprecation messages. Simplify conversion, use Stream methods directly. See #2138 Original pull request #2161 --- .../jdbc/core/JdbcAggregateOperations.java | 12 ++++-- .../data/jdbc/core/JdbcAggregateTemplate.java | 8 ++-- .../FetchableFluentQueryByExample.java | 39 ++++++++++--------- .../support/SimpleJdbcRepository.java | 11 +----- .../core/JdbcAggregateOperationsExtensions.kt | 3 +- 5 files changed, 36 insertions(+), 37 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 c30429694..be1a37f70 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,9 +230,11 @@ 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. Use {@link #findAll(Class, Sort)} together with {@link #count(Class)} to construct results + * of type {@link Page}.The API design is conflicts regarding pagination information. Also, pagination is + * primarily a feature of the repository and not the template API. */ - @Deprecated(since = "4.0") + @Deprecated(since = "4.0", forRemoval = true) Page findAll(Class domainType, Pageable pageable); /** @@ -277,9 +279,11 @@ 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. Use {@link #findAll(Query, Class)} together with {@link #count(Query, Class)} to construct + * results of type {@link Page}. The API design is conflicts regarding pagination information. Also, + * pagination is primarily a feature of the repository and not the template API. */ - @Deprecated(since = "4.0") + @Deprecated(since = "4.0", forRemoval = true) 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 ad078f1eb..1a5163409 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 @@ -31,6 +31,7 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; import org.jspecify.annotations.Nullable; + import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -41,7 +42,6 @@ import org.springframework.data.domain.Sort; import org.springframework.data.jdbc.core.convert.DataAccessStrategy; import org.springframework.data.jdbc.core.convert.EntityRowMapper; import org.springframework.data.jdbc.core.convert.JdbcConverter; -import org.springframework.data.jdbc.core.convert.QueryMappingConfiguration; import org.springframework.data.mapping.IdentifierAccessor; import org.springframework.data.mapping.callback.EntityCallbacks; import org.springframework.data.relational.core.EntityLifecycleEventDelegate; @@ -78,6 +78,7 @@ import org.springframework.util.ClassUtils; * @author Sergey Korotaev * @author Mikhail Polivakha */ +@SuppressWarnings("removal") public class JdbcAggregateTemplate implements JdbcAggregateOperations, ApplicationContextAware { private final EntityLifecycleEventDelegate eventDelegate = new EntityLifecycleEventDelegate(); @@ -88,7 +89,6 @@ public class JdbcAggregateTemplate implements JdbcAggregateOperations, Applicati private final JdbcConverter converter; private @Nullable EntityCallbacks entityCallbacks; - private QueryMappingConfiguration queryMappingConfiguration = QueryMappingConfiguration.EMPTY; /** * Creates a new {@link JdbcAggregateTemplate} given {@link RelationalMappingContext} and {@link DataAccessStrategy}. @@ -359,8 +359,8 @@ public class JdbcAggregateTemplate implements JdbcAggregateOperations, Applicati return allStreamable.map(this::triggerAfterConvert); } - @Deprecated @Override + @Deprecated(since = "4.0", forRemoval = true) public Page findAll(Class domainType, Pageable pageable) { Assert.notNull(domainType, "Domain type must not be null"); @@ -389,8 +389,8 @@ public class JdbcAggregateTemplate implements JdbcAggregateOperations, Applicati return accessStrategy.streamAll(query, domainType).map(this::triggerAfterConvert); } - @Deprecated @Override + @Deprecated(since = "4.0", forRemoval = true) public Page findAll(Query query, Class domainType, Pageable pageable) { Iterable items = triggerAfterConvert(accessStrategy.findAll(query, domainType, 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 f56bc38fd..3785f2294 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 @@ -16,13 +16,11 @@ package org.springframework.data.jdbc.repository.support; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.function.Function; import java.util.function.UnaryOperator; import java.util.stream.Stream; -import java.util.stream.StreamSupport; import org.springframework.data.domain.Example; import org.springframework.data.domain.OffsetScrollPosition; @@ -89,16 +87,8 @@ class FetchableFluentQueryByExample extends FluentQuerySupport { private List findAll(Query query) { - Function conversionFunction = this.getConversionFunction(); - Iterable raw = this.entityOperations.findAll(query, getExampleType()); - - List result = new ArrayList<>(raw instanceof Collections ? ((Collection) raw).size() : 16); - - for (S s : raw) { - result.add(conversionFunction.apply(s)); - } - - return result; + List raw = this.entityOperations.findAll(query, getExampleType()); + return mapContent(raw); } @Override @@ -129,21 +119,33 @@ class FetchableFluentQueryByExample extends FluentQuerySupport { Query contentQuery = createQuery(p -> p.with(pageable)); List content = this.entityOperations.findAll(contentQuery, getExampleType()); + List result = mapContent(content); + + return PageableExecutionUtils.getPage(result, pageable, + () -> this.entityOperations.count(createQuery(), getExampleType())); + } + + @SuppressWarnings("unchecked") + private List mapContent(List content) { + + Function conversionFunction = getConversionFunction(); + + if (conversionFunction == Function.identity()) { + return (List) content; + } List result = new ArrayList<>(content.size()); for (S s : content) { - result.add(getConversionFunction().apply(s)); + result.add(conversionFunction.apply(s)); } - return PageableExecutionUtils.getPage(result, pageable, () -> this.entityOperations.count(createQuery(), getExampleType())); + return result; } @Override public Stream stream() { - - return StreamSupport - .stream(this.entityOperations.findAll(createQuery().sort(getSort()), getExampleType()).spliterator(), false) - .map(item -> this.getConversionFunction().apply(item)); + return this.entityOperations.streamAll(createQuery().sort(getSort()), getExampleType()) + .map(getConversionFunction()); } @Override @@ -169,7 +171,6 @@ class FetchableFluentQueryByExample extends FluentQuerySupport { } query = query.limit(getLimit()); - query = queryCustomizer.apply(query); return query; 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 a76e2621f..0f7c0df85 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,10 +145,7 @@ public class SimpleJdbcRepository Assert.notNull(pageable, "Pageable must not be null"); - Query query1 = Query.query(CriteriaDefinition.empty()); - - - Query query = query1.with(pageable); + Query query = Query.query(CriteriaDefinition.empty()).with(pageable); List content = entityOperations.findAll(query, entity.getType()); return PageableExecutionUtils.getPage(content, pageable, () -> entityOperations.count(entity.getType())); @@ -187,11 +184,7 @@ public class SimpleJdbcRepository Assert.notNull(pageable, "Pageable must not be null"); Query mappedQuery = this.exampleMapper.getMappedExample(example); - - - Query contentQuery = mappedQuery.with(pageable); - - List content = this.entityOperations.findAll(contentQuery, example.getProbeType()); + List content = this.entityOperations.findAll(mappedQuery.with(pageable), example.getProbeType()); return PageableExecutionUtils.getPage(content, pageable, () -> this.entityOperations.count(mappedQuery, example.getProbeType())); diff --git a/spring-data-jdbc/src/main/kotlin/org/springframework/data/jdbc/core/JdbcAggregateOperationsExtensions.kt b/spring-data-jdbc/src/main/kotlin/org/springframework/data/jdbc/core/JdbcAggregateOperationsExtensions.kt index 623d6b36e..14ced66df 100644 --- a/spring-data-jdbc/src/main/kotlin/org/springframework/data/jdbc/core/JdbcAggregateOperationsExtensions.kt +++ b/spring-data-jdbc/src/main/kotlin/org/springframework/data/jdbc/core/JdbcAggregateOperationsExtensions.kt @@ -80,7 +80,7 @@ inline fun JdbcAggregateOperations.findAll(sort: Sort): List() and count() to construct results of type Page") inline fun JdbcAggregateOperations.findAll(pageable: Pageable): Page = findAll(T::class.java, pageable) @@ -99,6 +99,7 @@ inline fun JdbcAggregateOperations.findAll(query: Query): List /** * Extension for [JdbcAggregateOperations.findAll] with query and pagination. */ +@Deprecated("Since 4.0, use a findAll(Query) and count(Query) to construct results of type Page") inline fun JdbcAggregateOperations.findAll( query: Query, pageable: Pageable