From b3a18c020fa52e4491f9b8926ed9061834a1bc7b Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Thu, 19 May 2022 16:19:14 +0200 Subject: [PATCH] Properly set up source result types from the start during query creation. For count queries always start with Long instead of the domain type (Hibernate 6 rejects a mismatch between the type the query was originally set up for and the type to be actually selected). For delete queries, do not use the type to be read, but the domain type as we load the individual instances first to make sure we properly fire entity callbacks. Related ticket: #2423. --- .../data/jpa/repository/query/JpaCountQueryCreator.java | 5 ++++- .../data/jpa/repository/query/JpaQueryCreator.java | 5 +++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java index 6b6c2a660..29e43080f 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaCountQueryCreator.java @@ -48,13 +48,16 @@ public class JpaCountQueryCreator extends JpaQueryCreator { */ public JpaCountQueryCreator(PartTree tree, ReturnedType type, CriteriaBuilder builder, ParameterMetadataProvider provider) { + super(tree, type, builder, provider); + this.distinct = tree.isDistinct(); } @Override protected CriteriaQuery createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) { - return builder.createQuery(type.getDomainType()); + + return builder.createQuery(Long.class); } @Override diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java index 836cca29f..16074ed2c 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java @@ -100,9 +100,10 @@ public class JpaQueryCreator extends AbstractQueryCreator createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) { - Class typeToRead = type.getTypeToRead(); + Class typeToRead = tree.isDelete() ? type.getDomainType() : type.getTypeToRead(); - return typeToRead == null || tree.isExistsProjection() ? builder.createTupleQuery() + return (typeToRead == null) || tree.isExistsProjection() // + ? builder.createTupleQuery() // : builder.createQuery(typeToRead); }