diff --git a/src/main/java/org/springframework/data/jpa/provider/HibernateJpaParametersParameterAccessor.java b/src/main/java/org/springframework/data/jpa/provider/HibernateJpaParametersParameterAccessor.java index 79df3fad1..ddabc9c90 100644 --- a/src/main/java/org/springframework/data/jpa/provider/HibernateJpaParametersParameterAccessor.java +++ b/src/main/java/org/springframework/data/jpa/provider/HibernateJpaParametersParameterAccessor.java @@ -68,4 +68,21 @@ class HibernateJpaParametersParameterAccessor extends JpaParametersParameterAcce } return new TypedParameterValue(type, null); } + + /** + * Utility method to potentially unwrap {@link TypedParameterValue}s. For certain operations, Hibernate doesn't + * properly support them, so we must unwrap them before passing through. + * + * @param extractedValue + * @return the value behind a {@link TypedParameterValue} + */ + @Override + public Object potentiallyUnwrap(Object extractedValue) { + + if (extractedValue instanceof TypedParameterValue) { + return ((TypedParameterValue) extractedValue).getValue(); + } else { + return extractedValue; + } + } } diff --git a/src/main/java/org/springframework/data/jpa/repository/query/JpaParametersParameterAccessor.java b/src/main/java/org/springframework/data/jpa/repository/query/JpaParametersParameterAccessor.java index fb1ff1b8b..64d925395 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/JpaParametersParameterAccessor.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/JpaParametersParameterAccessor.java @@ -45,6 +45,17 @@ public class JpaParametersParameterAccessor extends ParametersParameterAccessor return super.getValue(parameter.getIndex()); } + /** + * Utility method to potentially unwrap certain provider-specific types. For general JPA, there are none, so it's a pass-through. + * + * @param extractedValue + * @return the same value passed in + */ + @Nullable + public Object potentiallyUnwrap(Object extractedValue) { + return extractedValue; + } + @Override public Object[] getValues() { return super.getValues(); diff --git a/src/main/java/org/springframework/data/jpa/repository/query/QueryParameterSetter.java b/src/main/java/org/springframework/data/jpa/repository/query/QueryParameterSetter.java index 062864914..5833a636a 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/QueryParameterSetter.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/QueryParameterSetter.java @@ -15,7 +15,7 @@ */ package org.springframework.data.jpa.repository.query; -import static org.springframework.data.jpa.repository.query.QueryParameterSetter.ErrorHandling.LENIENT; +import static org.springframework.data.jpa.repository.query.QueryParameterSetter.ErrorHandling.*; import java.lang.reflect.Proxy; import java.util.Collections; @@ -33,7 +33,6 @@ import javax.persistence.criteria.ParameterExpression; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.hibernate.jpa.TypedParameterValue; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -87,16 +86,10 @@ interface QueryParameterSetter { final Object value; - // TODO: When https://github.com/hibernate/hibernate-orm/pull/5438 is merged we should be able to drop this. if (query.getQuery() instanceof StoredProcedureQuery) { Object extractedValue = valueExtractor.apply(accessor); - - if (extractedValue instanceof TypedParameterValue) { - value = ((TypedParameterValue) extractedValue).getValue(); - } else { - value = extractedValue; - } + value = accessor.potentiallyUnwrap(extractedValue); } else { value = valueExtractor.apply(accessor); }