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.
This commit is contained in:
Oliver Drotbohm
2022-05-19 16:19:14 +02:00
parent 9bce5dd9a4
commit b3a18c020f
2 changed files with 7 additions and 3 deletions

View File

@@ -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<? extends Object> createCriteriaQuery(CriteriaBuilder builder, ReturnedType type) {
return builder.createQuery(type.getDomainType());
return builder.createQuery(Long.class);
}
@Override

View File

@@ -100,9 +100,10 @@ public class JpaQueryCreator extends AbstractQueryCreator<CriteriaQuery<? extend
*/
protected CriteriaQuery<? extends Object> 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);
}