diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/HibernateJpaParametersParameterAccessor.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/HibernateJpaParametersParameterAccessor.java index 012971ffc..84561d28e 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/HibernateJpaParametersParameterAccessor.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/HibernateJpaParametersParameterAccessor.java @@ -27,6 +27,7 @@ import org.springframework.data.repository.query.Parameter; import org.springframework.data.repository.query.Parameters; import org.springframework.data.repository.query.ParametersParameterAccessor; import org.springframework.lang.Nullable; +import org.springframework.util.Assert; /** * {@link org.springframework.data.repository.query.ParameterAccessor} based on an {@link Parameters} instance. In @@ -86,14 +87,18 @@ class HibernateJpaParametersParameterAccessor extends JpaParametersParameterAcce * For Hibernate, check if the incoming value is wrapped inside a {@link TypedParameterValue} before extracting and * casting the {@link Date}. * - * @param extractedValue - * @since 3.1 + * @param value a value that is either a {@link Date} or a {@link TypedParameterValue} containing a {@literal Date}. + * @since 3.0.4 */ @Override - public Date extractDate(Object extractedValue) { + public Date unwrapDate(Object value) { - return (extractedValue instanceof TypedParameterValue typedParameterValue) - ? (Date) typedParameterValue.getValue() - : (Date) extractedValue; + Object extracted = (value instanceof TypedParameterValue typedParameterValue) // + ? typedParameterValue.getValue() // + : value; + + Assert.isInstanceOf(Date.class, extracted, "Value must be either of type Date or a Date wrapped in a TypedParameterValue"); + + return (Date) extracted; } } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaParametersParameterAccessor.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaParametersParameterAccessor.java index ea025d3cc..c95e65a44 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaParametersParameterAccessor.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaParametersParameterAccessor.java @@ -59,7 +59,7 @@ public class JpaParametersParameterAccessor extends ParametersParameterAccessor * @param extractedValue * @since 3.1 */ - public Date extractDate(Object extractedValue) { + public Date unwrapDate(Object extractedValue) { return (Date) extractedValue; } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryParameterSetter.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryParameterSetter.java index d16322db1..4e68fbc2d 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryParameterSetter.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryParameterSetter.java @@ -83,7 +83,7 @@ interface QueryParameterSetter { Object extractedValue = valueExtractor.apply(accessor); - final Date value = accessor.extractDate(extractedValue); + final Date value = accessor.unwrapDate(extractedValue); // One would think we can simply use parameter to identify the parameter we want to set. // But that does not work with list valued parameters. At least Hibernate tries to bind them by name. diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/NamedOrIndexedQueryParameterSetterUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/NamedOrIndexedQueryParameterSetterUnitTests.java index 6de4cc64f..c6127b1a3 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/NamedOrIndexedQueryParameterSetterUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/NamedOrIndexedQueryParameterSetterUnitTests.java @@ -68,7 +68,7 @@ class NamedOrIndexedQueryParameterSetterUnitTests { Date testDate = new Date(); when(accessor.getValues()).thenReturn(new Object[] { testDate }); - when(accessor.extractDate(testDate)).thenReturn(testDate); + when(accessor.unwrapDate(testDate)).thenReturn(testDate); this.methodArguments = accessor; }