Skip to content

Commit b3a18c0

Browse files
committed
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.
1 parent 9bce5dd commit b3a18c0

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-3
lines changed

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,16 @@ public class JpaCountQueryCreator extends JpaQueryCreator {
4848
*/
4949
public JpaCountQueryCreator(PartTree tree, ReturnedType type, CriteriaBuilder builder,
5050
ParameterMetadataProvider provider) {
51+
5152
super(tree, type, builder, provider);
53+
5254
this.distinct = tree.isDistinct();
5355
}
5456

5557
@Override
5658
protected CriteriaQuery<? extends Object> createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) {
57-
return builder.createQuery(type.getDomainType());
59+
60+
return builder.createQuery(Long.class);
5861
}
5962

6063
@Override

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,10 @@ public JpaQueryCreator(PartTree tree, ReturnedType type, CriteriaBuilder builder
100100
*/
101101
protected CriteriaQuery<? extends Object> createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) {
102102

103-
Class<?> typeToRead = type.getTypeToRead();
103+
Class<?> typeToRead = tree.isDelete() ? type.getDomainType() : type.getTypeToRead();
104104

105-
return typeToRead == null || tree.isExistsProjection() ? builder.createTupleQuery()
105+
return (typeToRead == null) || tree.isExistsProjection() //
106+
? builder.createTupleQuery() //
106107
: builder.createQuery(typeToRead);
107108
}
108109

0 commit comments

Comments
 (0)