diff --git a/pom.xml b/pom.xml
index 6a6275432..8a1565932 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,7 +31,7 @@
3.0.2
- 5.6.9.Final
+ 6.1.1.Final
4.3
8.0.23
42.2.19
@@ -44,7 +44,7 @@
-
+
spring-data-envers
spring-data-jpa
spring-data-jpa-distribution
diff --git a/spring-data-envers/pom.xml b/spring-data-envers/pom.xml
index 59eb8eab8..540834bb6 100755
--- a/spring-data-envers/pom.xml
+++ b/spring-data-envers/pom.xml
@@ -62,8 +62,8 @@
- org.hibernate
- hibernate-envers-jakarta
+ org.hibernate.orm
+ hibernate-envers
${hibernate.envers}
diff --git a/spring-data-jpa/pom.xml b/spring-data-jpa/pom.xml
index ba9220cc2..3ad9c39a2 100644
--- a/spring-data-jpa/pom.xml
+++ b/spring-data-jpa/pom.xml
@@ -145,19 +145,26 @@
- ${hibernate.groupId}
- hibernate-core-jakarta
+ ${hibernate.groupId}.orm
+ hibernate-core
${hibernate}
true
- ${hibernate.groupId}
- hibernate-jpamodelgen-jakarta
+ ${hibernate.groupId}.orm
+ hibernate-jpamodelgen
${hibernate}
provided
+
+ jakarta.xml.bind
+ jakarta.xml.bind-api
+ ${jaxb}
+ provided
+
+
jakarta.annotation
jakarta.annotation-api
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 918ec58af..38eba8d73 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
@@ -16,14 +16,15 @@
package org.springframework.data.jpa.provider;
import jakarta.persistence.EntityManager;
-import org.hibernate.SessionFactory;
-import org.hibernate.TypeHelper;
-import org.hibernate.jpa.TypedParameterValue;
-import org.hibernate.type.Type;
+
+import org.hibernate.engine.spi.SessionFactoryImplementor;
+import org.hibernate.query.TypedParameterValue;
+import org.hibernate.type.BasicTypeRegistry;
import org.springframework.data.jpa.repository.query.JpaParametersParameterAccessor;
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;
/**
* {@link org.springframework.data.repository.query.ParameterAccessor} based on an {@link Parameters} instance. In
@@ -33,11 +34,13 @@ import org.springframework.data.repository.query.ParametersParameterAccessor;
* @author Wonchul Heo
* @author Jens Schauder
* @author Cedomir Igaly
+ * @author Robert Wilson
+ * @author Oliver Drotbohm
* @since 2.7
*/
class HibernateJpaParametersParameterAccessor extends JpaParametersParameterAccessor {
- private final TypeHelper typeHelper;
+ private final BasicTypeRegistry typeHelper;
/**
* Creates a new {@link ParametersParameterAccessor}.
@@ -50,21 +53,29 @@ class HibernateJpaParametersParameterAccessor extends JpaParametersParameterAcce
super(parameters, values);
- this.typeHelper = em.getEntityManagerFactory().unwrap(SessionFactory.class).getTypeHelper();
+ this.typeHelper = em.getEntityManagerFactory()
+ .unwrap(SessionFactoryImplementor.class)
+ .getTypeConfiguration()
+ .getBasicTypeRegistry();
}
@Override
+ @Nullable
+ @SuppressWarnings("unchecked")
public Object getValue(Parameter parameter) {
- Object value = super.getValue(parameter.getIndex());
+ var value = super.getValue(parameter.getIndex());
+
if (value != null) {
return value;
}
- Type type = typeHelper.basic(parameter.getType());
+ var type = typeHelper.getRegisteredType(parameter.getType());
+
if (type == null) {
return null;
}
- return new TypedParameterValue(type, null);
+
+ return new TypedParameterValue<>(type, null);
}
}
diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/HibernateUtils.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/HibernateUtils.java
index 3c6a3556f..2056db61d 100644
--- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/HibernateUtils.java
+++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/HibernateUtils.java
@@ -16,6 +16,7 @@
package org.springframework.data.jpa.provider;
import org.hibernate.query.Query;
+import org.hibernate.query.spi.SqmQuery;
import org.springframework.lang.Nullable;
/**
@@ -41,8 +42,20 @@ public abstract class HibernateUtils {
@Nullable
public static String getHibernateQuery(Object query) {
+ try {
+
+ // Try the new Hibernate implementation first
+ if (query instanceof SqmQuery) {
+ return ((SqmQuery) query).getSqmStatement().toHqlString();
+ }
+
+ // Couple of cases in which this still breaks, see HHH-15389
+ } catch (RuntimeException o_O) {}
+
+ // Try the old way, as it still works in some cases (haven't investigated in which exactly)
+
if (query instanceof Query) {
- return ((Query) query).getQueryString();
+ return ((Query>) query).getQueryString();
} else {
throw new IllegalArgumentException("Don't know how to extract the query string from " + query);
}
diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java
index f2d90b0c8..f3ef2f047 100644
--- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java
+++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java
@@ -24,7 +24,9 @@ import jakarta.persistence.metamodel.IdentifiableType;
import jakarta.persistence.metamodel.Metamodel;
import jakarta.persistence.metamodel.SingularAttribute;
+import java.util.Collection;
import java.util.Collections;
+import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;
@@ -186,6 +188,8 @@ public enum PersistenceProvider implements QueryExtractor, ProxyIdAccessor, Quer
}
};
+ private static final Collection ALL = List.of(HIBERNATE, ECLIPSELINK, GENERIC_JPA);
+
static ConcurrentReferenceHashMap, PersistenceProvider> CACHE = new ConcurrentReferenceHashMap<>();
private final Iterable entityManagerClassNames;
private final Iterable metamodelClassNames;
@@ -233,7 +237,7 @@ public enum PersistenceProvider implements QueryExtractor, ProxyIdAccessor, Quer
return cachedProvider;
}
- for (PersistenceProvider provider : values()) {
+ for (PersistenceProvider provider : ALL) {
for (String entityManagerClassName : provider.entityManagerClassNames) {
if (isEntityManagerOfType(em, entityManagerClassName)) {
return cacheAndReturn(entityManagerType, provider);
@@ -317,9 +321,9 @@ public enum PersistenceProvider implements QueryExtractor, ProxyIdAccessor, Quer
String GENERIC_JPA_ENTITY_MANAGER_INTERFACE = "jakarta.persistence.EntityManager";
String ECLIPSELINK_ENTITY_MANAGER_INTERFACE = "org.eclipse.persistence.jpa.JpaEntityManager";
// needed as Spring only exposes that interface via the EM proxy
- String HIBERNATE_ENTITY_MANAGER_INTERFACE = "org.hibernate.jpa.HibernateEntityManager";
+ String HIBERNATE_ENTITY_MANAGER_INTERFACE = "org.hibernate.engine.spi.SessionImplementor";
- String HIBERNATE_JPA_METAMODEL_TYPE = "org.hibernate.metamodel.internal.MetamodelImpl";
+ String HIBERNATE_JPA_METAMODEL_TYPE = "org.hibernate.metamodel.model.domain.JpaMetamodel";
String ECLIPSELINK_JPA_METAMODEL_TYPE = "org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl";
}
@@ -337,7 +341,7 @@ public enum PersistenceProvider implements QueryExtractor, ProxyIdAccessor, Quer
*/
private static class HibernateScrollableResultsIterator implements CloseableIterator