Spring Data 2025.1 Release Notes - spring-projects/spring-data-commons GitHub Wiki

General Themes

  • Upgrade to Spring Framework 7

  • Upgrade to Jakarta EE 11 (JPA 3.2, Servlet 6.1)

  • Upgrade to Kotlin 2.1

  • Strong use of JPQL in JPA

  • Removal of ListenableFuture support

Participating Modules

Details

New and Noteworthy

Spring Data Commons - 4.0

Removal of ListenableFuture support

With Spring Framework removing support for ListenableFuture, we’re removing support for ListenableFuture as well. Please use CompletableFuture when using @Async query methods.

Removal of deprecated API

PersistenceConstructor Migration

  • Removal of @PersistenceConstructor in favor of @PersistenceCreator

  • Removal of Parameter.hasSpelExpression() in favor of hasValueExpression().

  • Removal of PersistentEntity.getPersistenceConstructor() in favor of PersistentEntity.getInstanceCreatorMetadata() and isConstructorArgument(…) in favor of isCreatorArgument(…).

  • Removal of PreferredConstructor.isConstructorParameter(…) isCreatorParameter(…).

  • Removal of MappingInstantiationException.getConstructor(…) in favor of getEntityCreator().

SpEL to Value Expression Migration

  • Removal of DefaultSpELExpressionEvaluator and SpELExpressionEvaluator in favor of ValueExpressionEvaluator.

  • Removal of SpELExpressionParameterValueProvider in favor of ValueExpressionParameterValueProvider.

  • Removal of ValueExpressionParameterValueProvider.potentiallyConvertSpelValue(…) in favor of potentiallyConvertExpressionValue(…).

  • Removed ExtensionAwareQueryMethodEvaluationContextProvider, QueryMethodEvaluationContextProvider and their reactive variants in favor of Value Expression support. QueryMethodValueEvaluationContextAccessor.createEvaluationContextProvider(beanFactory) can help to create default instances.

  • Removed SpelEvaluator and SpelQueryContext in favor of ValueExpressionQueryRewriter

QueryMethod Parameters Revision

  • Removed QueryMethod.createParameters(Method method, TypeInformation<?> domainType) in favor of createParameters(ParametersSource parametersSource)

  • Removal of Parameter(MethodParameter parameter) and Parameters(Method method, Function<MethodParameter, T> parameterFactory).

ClassUtils and ReflectionUtils Revision

  • Removal of CastUtils without replacement. Apply casting where necessary.

  • Removal of org.springframework.data.repository.util.ClassUtils. Several methods went into org.springframework.data.util.ClassUtils and ReflectionUtils.

Other Changes

  • Removal of PersistentPropertyPath.getRequiredLeafProperty() in favor of getLeafProperty().

  • QPageRequest constructors are private now, use of factory methods.

  • Removal of AnnotationRepositoryConfigurationSource constructor

  • Removal of RepositoryFactorySupport.getTargetRepositoryViaReflection(…), use instantiateClass(…) instead.

  • Removed PagedResourcesAssembler.getMethodParameter(…) without replacement

  • Removed org.springframework.data.repository.util.ReactiveWrappers in favor of the variant in the org.springframework.data.util package.

  • ClassTypeInformation was made package-protected. Obtain instances of TypeInformation using the appropriate factory methods on TypeInformation.

  • Removal of the org.springframework.data.type.classreading package in favor of Spring’s AnnotationMetadata.

Spring Data JPA - 4.0

Upgrade to JPA 3.2

Spring Data JPA 4.0 upgrades its baseline to JPA 3.2, requiring Hibernate 7.0 and respective Eclipselink 5.0 runtime versions. With the upgrade, we refined our implementations to use Query.getSingleResultOrNull() for single-result query methods, resulting in the avoidance of NoResultException. Further changes include support of union, intersect, except, cast, left, right, and replace functions, and support for the || string concatenation operator.

Nulls Precedence

Upgrading to JPA 3.2 allows consistent support for nulls precedence in Sort expressions as the Criteria Query API allows declaration of nulls precedence. Previously, we only supported nulls precedence in JPQL queries.

Replace derived CriteriaQuery with String-based queries

15 years ago, Spring Data JPA started to see first light. Back then, it used String-based queries and eventually moved to JPA’s CriteriaQuery API to avoid string concatenation when building queries. It has been quite a ride with the Criteria API being powerful yet restricted as Hibernate was capable of way more functionality than exposed through the Criteria API (e.g. Nulls Precedence when sorting).

A couple of years into Criteria API, we started noticing a huge performance penalty using Criteria API. JPA providers have to evaluate the entire query on each query creation, whereas Hibernate is able to cache queries much better when using String-based JPQL queries.

We finally decided to explore a JPQL-based approach to derived queries and we found a 3.5x improvement in running such queries. While the factor 3.5x applies to in-memory databases, a typical application can still benefit from a roughly 25% improvement in query throughput by leveraging Hibernate’s query caching.

Using a different API that has proven over 15 years bears quite some risk in breaking applications that otherwise ran fine. We would appreciate your feedback on cases that behave differently than the previous version.

Refined Specification API

We revised our Specification API to better reflect its usage. Over time, we introduced specification support for delete queries, which uses a different query type hierarchy (CriteriaDelete), and that wasn’t an ideal fit for existing interfaces accepting CriteriaQuery.

We introduced DeleteSpecification and UpdateSpecification to enable seamless usage of delete respective update queries. Along with that change, we also introduced PredicateSpecification to define reusable specification functions that return Predicate regardless of the query context in which they are used.

Spring Data Relational - 4.0

Spring Data MongoDB - 5.0

Spring Data Neo4j - 8.0

Spring Data Elasticsearch - 6.0

Spring Data Couchbase - 6.0

Spring Data for Apache Cassandra - 5.0

Removal of ListenableFuture support

With Spring Framework removing support for ListenableFuture, we’re removing support for ListenableFuture as well. Packages org.springframework.data.cassandra.core.cql.legacy and o.s.d.c.core.legacy are removed. Use asynchronous template API implementations and their utilities from o.s.d.c.core.cql respective o.s.d.c.core returning CompletableFuture.

Spring Data Redis - 4.0

Spring Data KeyValue - 4.0

Spring Data REST - 5.0

Spring Data LDAP - 4.0

Release Dates

  • M1 - January 2025

  • M2 - March 2025

  • M3 - May 2025

  • M4 - July 2025

  • RC1 - Sept 2025

  • RC2 - Oct 2025

  • GA - Nov 2025

  • OSS Support until: May 2025

  • End of Life: Sept 2026

⚠️ **GitHub.com Fallback** ⚠️