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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user