diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerRuntimeHints.java b/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerRuntimeHints.java index 9f11670367f..b7517b38ad0 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerRuntimeHints.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/EntityManagerRuntimeHints.java @@ -39,8 +39,12 @@ class EntityManagerRuntimeHints implements RuntimeHintsRegistrar { private static final String ENTITY_MANAGER_FACTORY_CLASS_NAME = "jakarta.persistence.EntityManagerFactory"; + // Up to Hibernate 7.0 private static final String QUERY_SQM_IMPL_CLASS_NAME = "org.hibernate.query.sqm.internal.QuerySqmImpl"; + // As of Hibernate 7.1 + private static final String SQM_QUERY_IMPL_CLASS_NAME = "org.hibernate.query.sqm.internal.SqmQueryImpl"; + private static final String NATIVE_QUERY_IMPL_CLASS_NAME = "org.hibernate.query.sql.internal.NativeQueryImpl"; @@ -66,6 +70,12 @@ class EntityManagerRuntimeHints implements RuntimeHintsRegistrar { } catch (ClassNotFoundException ignored) { } + try { + Class clazz = ClassUtils.forName(SQM_QUERY_IMPL_CLASS_NAME, classLoader); + hints.proxies().registerJdkProxy(ClassUtils.getAllInterfacesForClass(clazz, classLoader)); + } + catch (ClassNotFoundException ignored) { + } try { Class clazz = ClassUtils.forName(NATIVE_QUERY_IMPL_CLASS_NAME, classLoader); hints.proxies().registerJdkProxy(ClassUtils.getAllInterfacesForClass(clazz, classLoader)); diff --git a/spring-orm/src/test/java/org/springframework/orm/jpa/EntityManagerRuntimeHintsTests.java b/spring-orm/src/test/java/org/springframework/orm/jpa/EntityManagerRuntimeHintsTests.java index cca7f047268..1ecb134a82c 100644 --- a/spring-orm/src/test/java/org/springframework/orm/jpa/EntityManagerRuntimeHintsTests.java +++ b/spring-orm/src/test/java/org/springframework/orm/jpa/EntityManagerRuntimeHintsTests.java @@ -19,6 +19,11 @@ package org.springframework.orm.jpa; import jakarta.persistence.EntityManagerFactory; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.hibernate.query.CommonQueryContract; +import org.hibernate.query.SelectionQuery; +import org.hibernate.query.hql.spi.SqmQueryImplementor; +import org.hibernate.query.spi.DomainQueryExecutionContext; +import org.hibernate.query.sqm.spi.InterpretationsKeySource; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -63,4 +68,14 @@ class EntityManagerRuntimeHintsTests { assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(EntityManagerFactory.class, "getCriteriaBuilder")).accepts(this.hints); assertThat(RuntimeHintsPredicates.reflection().onMethodInvocation(EntityManagerFactory.class, "getMetamodel")).accepts(this.hints); } + + @Test + void sqmQueryHints() { + assertThat(RuntimeHintsPredicates.proxies().forInterfaces( + SqmQueryImplementor.class, + InterpretationsKeySource.class, + DomainQueryExecutionContext.class, + SelectionQuery.class, + CommonQueryContract.class)).accepts(this.hints); + } }