Skip to content

Commit 4db0214

Browse files
committed
Only extract a TypedParameterValue when Hibernate is on the classpath.
Resolves #2857.
1 parent 6adff49 commit 4db0214

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java

+29-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515
*/
1616
package org.springframework.data.jpa.provider;
1717

18-
import static org.springframework.data.jpa.provider.JpaClassUtils.isEntityManagerOfType;
19-
import static org.springframework.data.jpa.provider.JpaClassUtils.isMetamodelOfType;
18+
import static org.springframework.data.jpa.provider.JpaClassUtils.*;
2019
import static org.springframework.data.jpa.provider.PersistenceProvider.Constants.*;
2120

2221
import jakarta.persistence.EntityManager;
@@ -25,14 +24,20 @@
2524
import jakarta.persistence.metamodel.Metamodel;
2625
import jakarta.persistence.metamodel.SingularAttribute;
2726

28-
import java.util.*;
27+
import java.util.Collection;
28+
import java.util.Collections;
29+
import java.util.Date;
30+
import java.util.List;
31+
import java.util.NoSuchElementException;
32+
import java.util.Set;
2933

3034
import org.eclipse.persistence.config.QueryHints;
3135
import org.eclipse.persistence.jpa.JpaQuery;
3236
import org.eclipse.persistence.queries.ScrollableCursor;
3337
import org.hibernate.ScrollMode;
3438
import org.hibernate.ScrollableResults;
3539
import org.hibernate.proxy.HibernateProxy;
40+
import org.hibernate.query.TypedParameterValue;
3641
import org.springframework.data.jpa.repository.query.JpaParameters;
3742
import org.springframework.data.jpa.repository.query.JpaParametersParameterAccessor;
3843
import org.springframework.data.util.CloseableIterator;
@@ -338,6 +343,27 @@ public static Object condense(Object value) {
338343
return value;
339344
}
340345

346+
/**
347+
* If Hibernate is on the classpath, potentially extract it's {@link TypedParameterValue}.
348+
*
349+
* @param extractedValue
350+
* @return either the {@link TypedParameterValue#getValue()} or the original value as a {@link Date}.
351+
* @since 3.1
352+
*/
353+
public static Date extractDate(Object extractedValue) {
354+
355+
ClassLoader classLoader = PersistenceProvider.class.getClassLoader();
356+
357+
if (ClassUtils.isPresent("org.hibernate.query.TypedParameterValue", classLoader)) {
358+
359+
return (extractedValue instanceof TypedParameterValue<?> typedParameterValue)
360+
? (Date) typedParameterValue.getValue()
361+
: (Date) extractedValue;
362+
}
363+
364+
return (Date) extractedValue;
365+
}
366+
341367
/**
342368
* Holds the PersistenceProvider specific interface names.
343369
*

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryParameterSetter.java

+4-7
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package org.springframework.data.jpa.repository.query;
1717

18-
import static org.springframework.data.jpa.repository.query.QueryParameterSetter.ErrorHandling.LENIENT;
18+
import static org.springframework.data.jpa.repository.query.QueryParameterSetter.ErrorHandling.*;
1919

2020
import jakarta.persistence.Parameter;
2121
import jakarta.persistence.Query;
@@ -32,7 +32,7 @@
3232

3333
import org.apache.commons.logging.Log;
3434
import org.apache.commons.logging.LogFactory;
35-
import org.hibernate.query.TypedParameterValue;
35+
import org.springframework.data.jpa.provider.PersistenceProvider;
3636
import org.springframework.lang.Nullable;
3737
import org.springframework.util.Assert;
3838

@@ -82,11 +82,8 @@ public void setParameter(BindableQuery query, JpaParametersParameterAccessor acc
8282

8383
if (temporalType != null) {
8484

85-
var extractedValue = valueExtractor.apply(accessor);
86-
87-
final Date value = (extractedValue instanceof TypedParameterValue<?> typedParameterValue)
88-
? (Date) typedParameterValue.getValue()
89-
: (Date) extractedValue;
85+
Object extractedValue = valueExtractor.apply(accessor);
86+
final Date value = PersistenceProvider.extractDate(extractedValue);
9087

9188
// One would think we can simply use parameter to identify the parameter we want to set.
9289
// But that does not work with list valued parameters. At least Hibernate tries to bind them by name.

0 commit comments

Comments
 (0)