diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/AbstractStringBasedJpaQuery.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/AbstractStringBasedJpaQuery.java index ad9252ba5a..9dfa4e56b9 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/AbstractStringBasedJpaQuery.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/AbstractStringBasedJpaQuery.java @@ -156,7 +156,7 @@ ReturnedType getReturnedType(ResultProcessor processor) { } if ((known != null && !known) || returnedJavaType.isArray() || getMetamodel().isJpaManaged(returnedJavaType) - || !returnedType.needsCustomConstruction()) { + || getMetamodel().isBasicType(returnedJavaType) || !returnedType.needsCustomConstruction()) { if (known == null) { knownProjections.put(returnedJavaType, false); } diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodel.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodel.java index fc2cb71ae2..8eeef0074a 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodel.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/util/JpaMetamodel.java @@ -19,6 +19,8 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; +import java.util.HashSet; import java.util.concurrent.ConcurrentHashMap; import jakarta.persistence.Embeddable; @@ -49,6 +51,7 @@ public class JpaMetamodel { private final Lazy>> managedTypes; private final Lazy>> jpaEmbeddables; + private final Lazy>> basicTypes; /** * Creates a new {@link JpaMetamodel} for the given JPA {@link Metamodel}. @@ -71,6 +74,16 @@ private JpaMetamodel(Metamodel metamodel) { .filter(Objects::nonNull) .filter(it -> AnnotatedElementUtils.isAnnotated(it, Embeddable.class)) .collect(StreamUtils.toUnmodifiableSet())); + + this.basicTypes = Lazy.of(() -> { + if (metamodel instanceof org.hibernate.metamodel.model.domain.JpaMetamodel hibernateMetamodel) { + Set> result = new HashSet<>(); + hibernateMetamodel.getTypeConfiguration().getJavaTypeRegistry() + .forEachDescriptor(d -> result.add(d.getJavaTypeClass())); + return result; + } + return Set.of(); + }); } public static JpaMetamodel of(Metamodel metamodel) { @@ -154,4 +167,9 @@ static void clear() { .filter(SingularAttribute::isId) // .findFirst(); } + + public boolean isBasicType(Class type) { + Assert.notNull(type, "Type must not be null"); + return basicTypes.get().contains(type); + } }