diff --git a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationIntegrator.java b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationIntegrator.java index 567d23b197..731684bd48 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationIntegrator.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationIntegrator.java @@ -91,7 +91,7 @@ public class BeanValidationIntegrator implements Integrator { Metadata metadata, BootstrapContext bootstrapContext, SessionFactoryImplementor sessionFactory) { - ServiceRegistryImplementor serviceRegistry = sessionFactory.getServiceRegistry(); + final ServiceRegistryImplementor serviceRegistry = sessionFactory.getServiceRegistry(); final ConfigurationService cfgService = serviceRegistry.requireService( ConfigurationService.class ); // IMPL NOTE : see the comments on ActivationContext.getValidationModes() as to why this is multi-valued... Object modeSetting = cfgService.getSettings().get( JAKARTA_MODE_PROPERTY ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataImpl.java index 8387f7bc31..17f6594bc4 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataImpl.java @@ -46,7 +46,6 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.event.service.spi.EventListenerGroup; import org.hibernate.event.service.spi.EventListenerRegistry; import org.hibernate.event.spi.EventType; -import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.mapping.Collection; import org.hibernate.mapping.Column; import org.hibernate.mapping.Component; diff --git a/hibernate-core/src/main/java/org/hibernate/cache/internal/CollectionCacheInvalidator.java b/hibernate-core/src/main/java/org/hibernate/cache/internal/CollectionCacheInvalidator.java index 8188d3194c..4bd82d6d08 100644 --- a/hibernate-core/src/main/java/org/hibernate/cache/internal/CollectionCacheInvalidator.java +++ b/hibernate-core/src/main/java/org/hibernate/cache/internal/CollectionCacheInvalidator.java @@ -37,7 +37,7 @@ import org.jboss.logging.Logger; /** * Allows the collection cache to be automatically evicted if an element is inserted/removed/updated *without* properly * managing both sides of the association (ie, the ManyToOne collection is changed w/o properly managing the OneToMany). - * + *

* For this functionality to be used, {@value org.hibernate.cfg.AvailableSettings#AUTO_EVICT_COLLECTION_CACHE} must be * enabled. For performance reasons, it's disabled by default. * @@ -90,7 +90,8 @@ public class CollectionCacheInvalidator // Nothing to do, if caching is disabled return; } - final EventListenerRegistry eventListenerRegistry = sessionFactory.getServiceRegistry().requireService( EventListenerRegistry.class ); + final EventListenerRegistry eventListenerRegistry = + sessionFactory.getServiceRegistry().requireService( EventListenerRegistry.class ); eventListenerRegistry.appendListeners( EventType.POST_INSERT, this ); eventListenerRegistry.appendListeners( EventType.POST_DELETE, this ); eventListenerRegistry.appendListeners( EventType.POST_UPDATE, this ); diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java index 0aacc3f7dc..0899b4b3c3 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java @@ -30,7 +30,6 @@ import org.hibernate.metamodel.CollectionClassification; import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.CollectionPart; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; -import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.EntityValuedModelPart; import org.hibernate.metamodel.mapping.ForeignKeyDescriptor; import org.hibernate.metamodel.mapping.ModelPart; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/MappingMetamodel.java b/hibernate-core/src/main/java/org/hibernate/metamodel/MappingMetamodel.java index 62c8314a59..a721bfce5f 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/MappingMetamodel.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/MappingMetamodel.java @@ -202,11 +202,11 @@ public interface MappingMetamodel { void addNamedEntityGraph(String graphName, RootGraphImplementor entityGraph); void forEachNamedGraph(Consumer> action); RootGraph defaultGraph(String entityName); - RootGraph defaultGraph(Class entityJavaType); + RootGraph defaultGraph(Class entityJavaType); RootGraph defaultGraph(EntityPersister entityDescriptor); RootGraph defaultGraph(EntityDomainType entityDomainType); - List> findRootGraphsForType(Class baseEntityJavaType); + List> findRootGraphsForType(Class baseEntityJavaType); List> findRootGraphsForType(String baseEntityName); List> findRootGraphsForType(EntityPersister baseEntityDescriptor); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/DomainModelHelper.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/DomainModelHelper.java index ac3ad3a5ed..379401d004 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/DomainModelHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/DomainModelHelper.java @@ -11,14 +11,14 @@ import org.hibernate.graph.internal.SubGraphImpl; import org.hibernate.graph.spi.SubGraphImplementor; import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.mapping.EntityMappingType; -import org.hibernate.metamodel.mapping.MappingModelHelper; import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.metamodel.model.domain.EmbeddableDomainType; import org.hibernate.metamodel.model.domain.EntityDomainType; import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.metamodel.model.domain.ManagedDomainType; import org.hibernate.metamodel.model.domain.PersistentAttribute; -import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; + +import static org.hibernate.metamodel.mapping.MappingModelHelper.isCompatibleModelPart; /** * Helper containing utilities useful for domain model handling @@ -38,16 +38,16 @@ public class DomainModelHelper { } // first, try to find it by name directly - ManagedDomainType subManagedType = jpaMetamodel.resolveHqlEntityReference( subTypeName ); + final ManagedDomainType subManagedType = jpaMetamodel.resolveHqlEntityReference( subTypeName ); if ( subManagedType != null ) { return subManagedType; } // it could still be a mapped-superclass try { - final Class javaType = jpaMetamodel.getServiceRegistry() - .requireService( ClassLoaderService.class ) - .classForName( subTypeName ); + final Class javaType = + jpaMetamodel.getServiceRegistry().requireService( ClassLoaderService.class ) + .classForName( subTypeName ); return (ManagedDomainType) jpaMetamodel.managedType( javaType ); } catch (Exception ignore) { @@ -59,27 +59,19 @@ public class DomainModelHelper { static boolean isCompatible( PersistentAttribute attribute1, PersistentAttribute attribute2, - JpaMetamodel jpaMetamodel) { + MappingMetamodel mappingMetamodel) { if ( attribute1 == attribute2 ) { return true; } - final MappingMetamodel runtimeMetamodels = - //TODO: eliminate this cast! - ((JpaMetamodelImplementor) jpaMetamodel).getMappingMetamodel(); - final ModelPart modelPart1 = getEntityAttributeModelPart( - attribute1, - attribute1.getDeclaringType(), - runtimeMetamodels - ); - final ModelPart modelPart2 = getEntityAttributeModelPart( - attribute2, - attribute2.getDeclaringType(), - runtimeMetamodels - ); - return modelPart1 != null && modelPart2 != null && MappingModelHelper.isCompatibleModelPart( - modelPart1, - modelPart2 - ); + else { + final ModelPart modelPart1 = + getEntityAttributeModelPart( attribute1, attribute1.getDeclaringType(), mappingMetamodel ); + final ModelPart modelPart2 = + getEntityAttributeModelPart( attribute2, attribute2.getDeclaringType(), mappingMetamodel ); + return modelPart1 != null + && modelPart2 != null + && isCompatibleModelPart( modelPart1, modelPart2 ); + } } static ModelPart getEntityAttributeModelPart( @@ -95,7 +87,7 @@ public class DomainModelHelper { for ( ManagedDomainType subType : domainType.getSubTypes() ) { final ModelPart modelPart = getEntityAttributeModelPart( attribute, subType, mappingMetamodel ); if ( modelPart != null ) { - if ( candidate != null && !MappingModelHelper.isCompatibleModelPart( candidate, modelPart ) ) { + if ( candidate != null && !isCompatibleModelPart( candidate, modelPart ) ) { return null; } candidate = modelPart; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java index 891a085378..ca0df79dd1 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java @@ -7,6 +7,7 @@ package org.hibernate.metamodel.model.domain.internal; import java.io.ObjectStreamException; +import java.io.Serial; import java.io.Serializable; import java.util.Collection; import java.util.Locale; @@ -75,16 +76,13 @@ public class EntityTypeImpl metamodel.getMappingMetamodel() .getEntityDescriptor( getHibernateEntityName() ); final DiscriminatorMetadata discriminatorMetadata = entityDescriptor.getTypeDiscriminatorMetadata(); - final DomainType discriminatorType = + final DomainType discriminatorType = discriminatorMetadata != null - ? (DomainType) discriminatorMetadata.getResolutionType() + ? (DomainType) discriminatorMetadata.getResolutionType() : metamodel.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.STRING ); - this.discriminatorPathSource = discriminatorType == null ? null : new EntityDiscriminatorSqmPathSource( - discriminatorType, - this, - entityDescriptor - ); + this.discriminatorPathSource = discriminatorType == null ? null + : new EntityDiscriminatorSqmPathSource<>( discriminatorType, this, entityDescriptor ); } public EntityTypeImpl( @@ -147,16 +145,16 @@ public class EntityTypeImpl if ( attribute != null ) { return (SqmPathSource) attribute; } - - if ( EntityIdentifierMapping.matchesRoleName( name ) ) { + else if ( EntityIdentifierMapping.matchesRoleName( name ) ) { return hasSingleIdAttribute() ? findIdAttribute() : getIdentifierDescriptor(); } - if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) { + else if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) { return discriminatorPathSource; } - - return null; + else { + return null; + } } @Override @@ -165,29 +163,31 @@ public class EntityTypeImpl if ( attribute != null ) { return (SqmPathSource) attribute; } - - PersistentAttribute subtypeAttribute = findSubtypeAttribute( name, metamodel ); - if ( subtypeAttribute != null ) { - return (SqmPathSource) subtypeAttribute; + else { + //TODO: eliminate this cast! + final PersistentAttribute subtypeAttribute = findSubtypeAttribute( name ); + if ( subtypeAttribute != null ) { + return (SqmPathSource) subtypeAttribute; + } + else if ( EntityIdentifierMapping.matchesRoleName( name ) ) { + return hasSingleIdAttribute() ? findIdAttribute() : getIdentifierDescriptor(); + } + else if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) { + return discriminatorPathSource; + } + else { + return null; + } } - - if ( EntityIdentifierMapping.matchesRoleName( name ) ) { - return hasSingleIdAttribute() ? findIdAttribute() : getIdentifierDescriptor(); - } - - if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) { - return discriminatorPathSource; - } - - return null; } - private PersistentAttribute findSubtypeAttribute(String name, JpaMetamodel metamodel) { + private PersistentAttribute findSubtypeAttribute(String name) { PersistentAttribute subtypeAttribute = null; for ( ManagedDomainType subtype : getSubTypes() ) { final PersistentAttribute candidate = subtype.findSubTypesAttribute( name ); if ( candidate != null ) { - if ( subtypeAttribute != null && !isCompatible( subtypeAttribute, candidate, metamodel ) ) { + if ( subtypeAttribute != null + && !isCompatible( subtypeAttribute, candidate, metamodel.getMappingMetamodel() ) ) { throw new PathException( String.format( Locale.ROOT, @@ -211,12 +211,12 @@ public class EntityTypeImpl if ( attribute != null ) { return attribute; } - - if ( EntityIdentifierMapping.matchesRoleName( name ) ) { + else if ( EntityIdentifierMapping.matchesRoleName( name ) ) { return findIdAttribute(); } - - return null; + else { + return null; + } } @Override @@ -255,6 +255,7 @@ public class EntityTypeImpl // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Serialization + @Serial protected Object writeReplace() throws ObjectStreamException { return new SerialForm( metamodel, getHibernateEntityName() ); } @@ -268,6 +269,7 @@ public class EntityTypeImpl this.hibernateEntityName = hibernateEntityName; } + @Serial private Object readResolve() { return jpaMetamodel.entity( hibernateEntityName ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java index c41fca0c00..86393421ed 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java @@ -12,7 +12,6 @@ import java.io.Serializable; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -70,6 +69,8 @@ import jakarta.persistence.metamodel.EntityType; import jakarta.persistence.metamodel.ManagedType; import jakarta.persistence.metamodel.Type; +import static java.util.Collections.emptySet; + /** * * @author Steve Ebersole @@ -247,17 +248,12 @@ public class JpaMetamodelImpl implements JpaMetamodelImplementor, Serializable { } private Collection> getAllManagedTypes() { - switch ( jpaMetaModelPopulationSetting ) { - case IGNORE_UNSUPPORTED: - return managedTypeByClass.values(); - case ENABLED: - return managedTypeByName.values(); - case DISABLED: - return Collections.emptySet(); - default: - // should never happen - throw new AssertionError(); - } + // should never happen + return switch (jpaMetaModelPopulationSetting) { + case IGNORE_UNSUPPORTED -> managedTypeByClass.values(); + case ENABLED -> managedTypeByName.values(); + case DISABLED -> emptySet(); + }; } @Override @@ -649,9 +645,8 @@ public class JpaMetamodelImpl implements JpaMetamodelImplementor, Serializable { } } - typeConfiguration.getJavaTypeRegistry().forEachDescriptor( (descriptor) -> { - if ( descriptor instanceof EnumJavaType ) { - final EnumJavaType> enumJavaType = (EnumJavaType>) descriptor; + typeConfiguration.getJavaTypeRegistry().forEachDescriptor( descriptor -> { + if ( descriptor instanceof EnumJavaType> enumJavaType ) { final Class> enumJavaClass = enumJavaType.getJavaTypeClass(); final Enum[] enumConstants = enumJavaClass.getEnumConstants(); for ( Enum enumConstant : enumConstants ) { diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java index 13a8b31113..5eb164c15a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java @@ -70,7 +70,6 @@ import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.type.BasicType; import org.hibernate.type.ComponentType; -import org.hibernate.type.Type; import org.hibernate.type.descriptor.java.EnumJavaType; import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry; @@ -315,38 +314,32 @@ public class MappingMetamodelImpl extends QueryParameterBindingTypeResolverImpl modelCreationContext ); collectionPersisterMap.put( model.getRole(), persister ); - final Type indexType = persister.getIndexType(); - if ( indexType instanceof org.hibernate.type.EntityType ) { - final String entityName = ( (org.hibernate.type.EntityType) indexType ).getAssociatedEntityName(); - Set roles = collectionRolesByEntityParticipant.get( entityName ); - //noinspection Java8MapApi - if ( roles == null ) { - roles = new HashSet<>(); - collectionRolesByEntityParticipant.put( entityName, roles ); - } - roles.add( persister.getRole() ); + if ( persister.getIndexType() instanceof org.hibernate.type.EntityType entityType ) { + registerEntityParticipant( entityType, persister ); } - final Type elementType = persister.getElementType(); - if ( elementType instanceof org.hibernate.type.EntityType ) { - final String entityName = ( (org.hibernate.type.EntityType) elementType ).getAssociatedEntityName(); - Set roles = collectionRolesByEntityParticipant.get( entityName ); - //noinspection Java8MapApi - if ( roles == null ) { - roles = new HashSet<>(); - collectionRolesByEntityParticipant.put( entityName, roles ); - } - roles.add( persister.getRole() ); + if ( persister.getElementType() instanceof org.hibernate.type.EntityType entityType ) { + registerEntityParticipant( entityType, persister ); } } } + private void registerEntityParticipant(org.hibernate.type.EntityType entityType, CollectionPersister persister) { + final String entityName = entityType.getAssociatedEntityName(); + Set roles = collectionRolesByEntityParticipant.get( entityName ); + //noinspection Java8MapApi + if ( roles == null ) { + roles = new HashSet<>(); + collectionRolesByEntityParticipant.put( entityName, roles ); + } + roles.add( persister.getRole() ); + } + private static void registerEntityNameResolvers( EntityPersister persister, Set entityNameResolvers) { - if ( persister.getRepresentationStrategy() == null ) { - return; + if ( persister.getRepresentationStrategy() != null ) { + registerEntityNameResolvers( persister.getRepresentationStrategy(), entityNameResolvers ); } - registerEntityNameResolvers( persister.getRepresentationStrategy(), entityNameResolvers ); } private static void registerEntityNameResolvers( @@ -607,7 +600,7 @@ public class MappingMetamodelImpl extends QueryParameterBindingTypeResolverImpl @Override @SuppressWarnings("deprecation") public EntityPersister entityPersister(String entityName) throws MappingException { - EntityPersister result = entityPersisterMap.get( entityName ); + final EntityPersister result = entityPersisterMap.get( entityName ); if ( result == null ) { throw new MappingException( "Unknown entity: " + entityName ); } @@ -641,7 +634,7 @@ public class MappingMetamodelImpl extends QueryParameterBindingTypeResolverImpl @Override public CollectionPersister getCollectionDescriptor(String role) { - CollectionPersister collectionPersister = collectionPersisterMap.get( role ); + final CollectionPersister collectionPersister = collectionPersisterMap.get( role ); if ( collectionPersister == null ) { throw new IllegalArgumentException( "Unable to locate persister: " + role ); } @@ -719,7 +712,7 @@ public class MappingMetamodelImpl extends QueryParameterBindingTypeResolverImpl } @Override - public RootGraph defaultGraph(Class entityJavaType) { + public RootGraph defaultGraph(Class entityJavaType) { throw new UnsupportedOperationException(); } @@ -734,7 +727,7 @@ public class MappingMetamodelImpl extends QueryParameterBindingTypeResolverImpl } @Override - public List> findRootGraphsForType(Class baseEntityJavaType) { + public List> findRootGraphsForType(Class baseEntityJavaType) { throw new UnsupportedOperationException(); } @@ -782,8 +775,7 @@ public class MappingMetamodelImpl extends QueryParameterBindingTypeResolverImpl public MappingModelExpressible resolveMappingExpressible( SqmExpressible sqmExpressible, Function tableGroupLocator) { - if ( sqmExpressible instanceof SqmPath ) { - final SqmPath sqmPath = (SqmPath) sqmExpressible; + if ( sqmExpressible instanceof SqmPath sqmPath ) { final NavigablePath navigablePath = sqmPath.getNavigablePath(); if ( navigablePath.getParent() != null ) { final TableGroup parentTableGroup = tableGroupLocator.apply( navigablePath.getParent() ); @@ -804,35 +796,34 @@ public class MappingMetamodelImpl extends QueryParameterBindingTypeResolverImpl return resolveMappingExpressible( sqmExpressible.getSqmType(), tableGroupLocator ); } - if ( sqmExpressible instanceof SqmFieldLiteral ) { - return getTypeConfiguration().getBasicTypeForJavaType( ( (SqmFieldLiteral) sqmExpressible).getJavaType() ); + if ( sqmExpressible instanceof SqmFieldLiteral sqmFieldLiteral ) { + return getTypeConfiguration().getBasicTypeForJavaType( sqmFieldLiteral.getJavaType() ); } if ( sqmExpressible instanceof CompositeSqmPathSource ) { throw new UnsupportedOperationException( "Resolution of embedded-valued SqmExpressible nodes not yet implemented" ); } - if ( sqmExpressible instanceof AnonymousTupleSqmPathSource ) { + if ( sqmExpressible instanceof AnonymousTupleSqmPathSource anonymousTupleSqmPathSource ) { return resolveMappingExpressible( - ( (AnonymousTupleSqmPathSource) sqmExpressible ).getSqmPathType(), + anonymousTupleSqmPathSource.getSqmPathType(), tableGroupLocator ); } - if ( sqmExpressible instanceof EmbeddableTypeImpl ) { + if ( sqmExpressible instanceof EmbeddableTypeImpl ) { return (MappingModelExpressible) sqmExpressible; } - if ( sqmExpressible instanceof EntityDomainType ) { - return getEntityDescriptor( ( (EntityDomainType) sqmExpressible).getHibernateEntityName() ); + if ( sqmExpressible instanceof EntityDomainType entityDomainType ) { + return getEntityDescriptor( entityDomainType.getHibernateEntityName() ); } - if ( sqmExpressible instanceof TupleType ) { + if ( sqmExpressible instanceof TupleType tupleType ) { final MappingModelExpressible mappingModelExpressible = tupleTypeCache.get(sqmExpressible); if ( mappingModelExpressible != null ) { return mappingModelExpressible; } - final TupleType tupleType = (TupleType) sqmExpressible; final MappingModelExpressible[] components = new MappingModelExpressible[tupleType.componentCount()]; for ( int i = 0; i < components.length; i++ ) { components[i] = resolveMappingExpressible( tupleType.get( i ), tableGroupLocator ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/SortDirection.java b/hibernate-core/src/main/java/org/hibernate/query/SortDirection.java index 8f65af5cb9..e17b878283 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/SortDirection.java +++ b/hibernate-core/src/main/java/org/hibernate/query/SortDirection.java @@ -30,10 +30,12 @@ public enum SortDirection { if ( value == null ) { return null; } - else return switch ( value.toLowerCase(Locale.ROOT) ) { - case "asc", "ascending" -> ASCENDING; - case "desc", "descending" -> DESCENDING; - default -> throw new IllegalArgumentException( "Unknown sort order: " + value ); - }; + else { + return switch ( value.toLowerCase(Locale.ROOT) ) { + case "asc", "ascending" -> ASCENDING; + case "desc", "descending" -> DESCENDING; + default -> throw new IllegalArgumentException( "Unknown sort order: " + value ); + }; + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java index 734ca89028..ee86f8664f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java @@ -3384,7 +3384,7 @@ public interface HibernateCriteriaBuilder extends CriteriaBuilder { * @since 6.4 */ @Incubating - JpaExpression collectionToString(Expression> collectionExpression, Expression separatorExpression); + JpaExpression collectionToString(Expression> collectionExpression, Expression separatorExpression); /** * Concatenates the non-null basic collection elements with a separator, as specified by the arguments. @@ -3392,7 +3392,7 @@ public interface HibernateCriteriaBuilder extends CriteriaBuilder { * @since 6.4 */ @Incubating - JpaExpression collectionToString(Expression> collectionExpression, String separator); + JpaExpression collectionToString(Expression> collectionExpression, String separator); /** * Whether a basic collection contains an element. diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java index 53dc2282b8..e9353ece6e 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java @@ -3086,7 +3086,7 @@ public class HibernateCriteriaBuilderDelegate implements HibernateCriteriaBuilde @Override @Incubating - public JpaExpression collectionToString( + public JpaExpression collectionToString( Expression> collectionExpression, Expression separatorExpression) { return criteriaBuilder.collectionToString( collectionExpression, separatorExpression ); @@ -3094,7 +3094,7 @@ public class HibernateCriteriaBuilderDelegate implements HibernateCriteriaBuilde @Override @Incubating - public JpaExpression collectionToString( + public JpaExpression collectionToString( Expression> collectionExpression, String separator) { return criteriaBuilder.collectionToString( collectionExpression, separator ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java index ba28971fd3..9f200c8548 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java @@ -486,10 +486,10 @@ public interface NodeBuilder extends HibernateCriteriaBuilder, BindingContext { SqmExpression> collectionFill(T element, Integer elementCount); @Override - SqmExpression collectionToString(Expression> collectionExpression, Expression separatorExpression); + SqmExpression collectionToString(Expression> collectionExpression, Expression separatorExpression); @Override - SqmExpression collectionToString(Expression> collectionExpression, String separator); + SqmExpression collectionToString(Expression> collectionExpression, String separator); @Override SqmPredicate collectionContains(Expression> collectionExpression, Expression elementExpression); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java index eedb762ccd..376e9e62ac 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java @@ -443,13 +443,10 @@ public class ConcreteSqmSelectQueryPlan implements SelectQueryPlan { } private JdbcParameterBindings createJdbcParameterBindings(CacheableSqmInterpretation sqmInterpretation, DomainQueryExecutionContext executionContext) { - final SharedSessionContractImplementor session = executionContext.getSession(); return SqmUtil.createJdbcParameterBindings( executionContext.getQueryParameterBindings(), domainParameterXref, sqmInterpretation.getJdbcParamsXref(), - session.getFactory().getRuntimeMetamodels().getMappingMetamodel(), - sqmInterpretation.getTableGroupAccess()::findTableGroup, new SqmParameterMappingModelResolutionAccess() { //this is pretty ugly! @Override @SuppressWarnings("unchecked") @@ -457,7 +454,7 @@ public class ConcreteSqmSelectQueryPlan implements SelectQueryPlan { return (MappingModelExpressible) sqmInterpretation.getSqmParameterMappingModelTypes().get(parameter); } }, - session + executionContext.getSession() ); } @@ -494,8 +491,6 @@ public class ConcreteSqmSelectQueryPlan implements SelectQueryPlan { executionContext.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, - session.getFactory().getRuntimeMetamodels().getMappingMetamodel(), - tableGroupAccess::findTableGroup, new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleDeleteQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleDeleteQueryPlan.java index d7b980fa86..f5f9b525af 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleDeleteQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleDeleteQueryPlan.java @@ -94,8 +94,6 @@ public class SimpleDeleteQueryPlan implements NonSelectQueryPlan { executionContext.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, - factory.getRuntimeMetamodels().getMappingMetamodel(), - sqmInterpretation.getFromClauseAccess()::findTableGroup, new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleInsertQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleInsertQueryPlan.java index b8016d51af..04126df5eb 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleInsertQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleInsertQueryPlan.java @@ -19,14 +19,10 @@ import org.hibernate.query.spi.NonSelectQueryPlan; import org.hibernate.query.spi.QueryParameterImplementor; import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess; import org.hibernate.query.sqm.sql.SqmTranslation; -import org.hibernate.query.sqm.sql.SqmTranslator; import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.insert.SqmInsertStatement; import org.hibernate.sql.ast.SqlAstTranslator; -import org.hibernate.sql.ast.spi.FromClauseAccess; import org.hibernate.sql.ast.tree.MutationStatement; -import org.hibernate.sql.ast.tree.insert.InsertStatement; -import org.hibernate.sql.exec.spi.JdbcOperationQueryInsert; import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParametersList; @@ -40,7 +36,6 @@ public class SimpleInsertQueryPlan implements NonSelectQueryPlan { private Map, MappingModelExpressible> paramTypeResolutions; private JdbcOperationQueryMutation jdbcInsert; - private FromClauseAccess tableGroupAccess; private Map, Map, List>> jdbcParamsXref; public SimpleInsertQueryPlan( @@ -64,8 +59,6 @@ public class SimpleInsertQueryPlan implements NonSelectQueryPlan { ) .translate(); - tableGroupAccess = sqmInterpretation.getFromClauseAccess(); - this.jdbcParamsXref = SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmInterpretation::getJdbcParamsBySqmParam @@ -94,8 +87,6 @@ public class SimpleInsertQueryPlan implements NonSelectQueryPlan { executionContext.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, - factory.getRuntimeMetamodels().getMappingMetamodel(), - tableGroupAccess::findTableGroup, new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleUpdateQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleUpdateQueryPlan.java index cbafe12cca..39c3d5ce06 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleUpdateQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleUpdateQueryPlan.java @@ -22,11 +22,8 @@ import org.hibernate.query.sqm.sql.SqmTranslation; import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.update.SqmUpdateStatement; import org.hibernate.sql.ast.SqlAstTranslator; -import org.hibernate.sql.ast.spi.FromClauseAccess; import org.hibernate.sql.ast.tree.MutationStatement; -import org.hibernate.sql.ast.tree.update.UpdateStatement; import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; -import org.hibernate.sql.exec.spi.JdbcOperationQueryUpdate; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParametersList; @@ -38,7 +35,6 @@ public class SimpleUpdateQueryPlan implements NonSelectQueryPlan { private final DomainParameterXref domainParameterXref; private JdbcOperationQueryMutation jdbcUpdate; - private FromClauseAccess tableGroupAccess; private Map, Map, List>> jdbcParamsXref; private Map, MappingModelExpressible> sqmParamMappingTypeResolutions; @@ -64,8 +60,6 @@ public class SimpleUpdateQueryPlan implements NonSelectQueryPlan { executionContext.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, - factory.getRuntimeMetamodels().getMappingMetamodel(), - tableGroupAccess::findTableGroup, new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { @@ -113,8 +107,6 @@ public class SimpleUpdateQueryPlan implements NonSelectQueryPlan { ) .translate(); - tableGroupAccess = sqmInterpretation.getFromClauseAccess(); - this.jdbcParamsXref = SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmInterpretation::getJdbcParamsBySqmParam diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java index e0e91eb987..6339000cb9 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java @@ -47,7 +47,6 @@ import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.metamodel.model.domain.SingularPersistentAttribute; import org.hibernate.metamodel.model.domain.internal.BasicTypeImpl; -import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; import org.hibernate.metamodel.spi.MappingMetamodelImplementor; import org.hibernate.query.BindableType; import org.hibernate.query.ImmutableEntityUpdateQueryHandlingMode; @@ -91,7 +90,6 @@ import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.produce.function.FunctionReturnTypeResolver; import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers; -import org.hibernate.query.sqm.spi.SqmCreationContext; import org.hibernate.query.sqm.tree.SqmQuery; import org.hibernate.query.sqm.tree.SqmStatement; import org.hibernate.query.sqm.tree.SqmTypedNode; @@ -339,8 +337,8 @@ public class SqmCriteriaNodeBuilder implements NodeBuilder, Serializable { } @Override - public JpaMetamodelImplementor getJpaMetamodel() { - return (JpaMetamodelImplementor) bindingContext.getJpaMetamodel(); + public JpaMetamodel getJpaMetamodel() { + return bindingContext.getJpaMetamodel(); } @Override @@ -1669,7 +1667,7 @@ public class SqmCriteriaNodeBuilder implements NodeBuilder, Serializable { @Override public SqmExpression concat(List> expressions) { - //noinspection unchecked + //noinspection RedundantCast, unchecked return getFunctionDescriptor( "concat" ).generateSqmExpression( (List>) (List) expressions, null, @@ -2073,8 +2071,7 @@ public class SqmCriteriaNodeBuilder implements NodeBuilder, Serializable { @Override public SqmExpression value(T value) { - if ( value instanceof Duration ) { - final Duration duration = (Duration) value; + if ( value instanceof Duration duration ) { final JpaExpression expression = duration.getNano() == 0 ? duration( duration.getSeconds(), TemporalUnit.SECOND ) : duration( duration.getNano() + duration.getSeconds() * 1_000_000_000, TemporalUnit.NANOSECOND ); @@ -2091,8 +2088,7 @@ public class SqmCriteriaNodeBuilder implements NodeBuilder, Serializable { } private boolean isInstance(BindableType bindableType, T value) { - if ( bindableType instanceof SqmExpressible ) { - final SqmExpressible expressible = (SqmExpressible) bindableType; + if ( bindableType instanceof SqmExpressible expressible ) { return expressible.getExpressibleJavaType().isInstance( value ); } else { @@ -2154,10 +2150,11 @@ public class SqmCriteriaNodeBuilder implements NodeBuilder, Serializable { BindableType bindableType = null; if ( elementTypeInferenceSource != null ) { if ( elementTypeInferenceSource instanceof BindableType ) { + //noinspection unchecked bindableType = (BindableType) elementTypeInferenceSource; } else if ( elementTypeInferenceSource.getNodeType() != null ) { - bindableType = (BindableType) elementTypeInferenceSource.getNodeType(); + bindableType = elementTypeInferenceSource.getNodeType(); } } DomainType elementType = null; @@ -2683,27 +2680,27 @@ public class SqmCriteriaNodeBuilder implements NodeBuilder, Serializable { @Override public > SqmPredicate isMember(Expression elem, Expression collection) { - return createSqmMemberOfPredicate( (SqmExpression) elem, (SqmPath) collection, false, this ); + return createSqmMemberOfPredicate( (SqmExpression) elem, (SqmPath) collection, false); } @Override public > SqmPredicate isMember(E elem, Expression collection) { - return createSqmMemberOfPredicate( value( elem ), (SqmPath) collection, false, this ); + return createSqmMemberOfPredicate( value( elem ), (SqmPath) collection, false); } @Override public > SqmPredicate isNotMember(Expression elem, Expression collection) { - return createSqmMemberOfPredicate( (SqmExpression) elem, (SqmPath) collection, true, this ); + return createSqmMemberOfPredicate( (SqmExpression) elem, (SqmPath) collection, true); } @Override public > SqmPredicate isNotMember(E elem, Expression collection) { - return createSqmMemberOfPredicate( value( elem ), (SqmPath) collection, true, this ); + return createSqmMemberOfPredicate( value( elem ), (SqmPath) collection, true); } - private SqmMemberOfPredicate createSqmMemberOfPredicate(SqmExpression elem, SqmPath collection, boolean negated, NodeBuilder nodeBuilder) { - if ( collection instanceof SqmPluralValuedSimplePath ) { - return new SqmMemberOfPredicate( elem, (SqmPluralValuedSimplePath) collection, negated, this ); + private SqmMemberOfPredicate createSqmMemberOfPredicate(SqmExpression elem, SqmPath collection, boolean negated) { + if ( collection instanceof SqmPluralValuedSimplePath pluralValuedSimplePath ) { + return new SqmMemberOfPredicate( elem, pluralValuedSimplePath, negated, this ); } else { throw new SemanticException( "Operand of 'member of' operator must be a plural path" ); @@ -5275,7 +5272,7 @@ public class SqmCriteriaNodeBuilder implements NodeBuilder, Serializable { } @Override - public SqmExpression collectionToString( + public SqmExpression collectionToString( Expression> collectionExpression, Expression separatorExpression) { return getFunctionDescriptor( "array_to_string" ).generateSqmExpression( @@ -5286,7 +5283,7 @@ public class SqmCriteriaNodeBuilder implements NodeBuilder, Serializable { } @Override - public SqmExpression collectionToString( + public SqmExpression collectionToString( Expression> collectionExpression, String separator) { return getFunctionDescriptor( "array_to_string" ).generateSqmExpression( diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java index ccca224ca0..43d15bef2c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java @@ -19,13 +19,11 @@ import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; -import java.util.function.Function; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.jpa.spi.JpaCompliance; -import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.metamodel.mapping.Bindable; import org.hibernate.metamodel.mapping.CollectionPart; @@ -91,7 +89,6 @@ import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.Clause; import org.hibernate.sql.ast.SqlTreeCreationException; import org.hibernate.sql.ast.tree.expression.JdbcParameter; -import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.spi.JdbcParameterBindings; @@ -188,8 +185,7 @@ public class SqmUtil { else { modelPart = modelPartContainer; } - if ( modelPart instanceof EntityAssociationMapping ) { - final EntityAssociationMapping association = (EntityAssociationMapping) modelPart; + if ( modelPart instanceof EntityAssociationMapping association ) { // If the path is one of the association's target key properties, // we need to render the target side if in group/order by if ( association.getTargetKeyPropertyNames().contains( sqmPath.getReferencedPathSource().getPathName() ) @@ -228,8 +224,7 @@ public class SqmUtil { */ @Deprecated(forRemoval = true, since = "6.6.1") public static boolean isFkOptimizationAllowed(SqmPath sqmPath) { - if ( sqmPath instanceof SqmJoin ) { - final SqmJoin sqmJoin = (SqmJoin) sqmPath; + if ( sqmPath instanceof SqmJoin sqmJoin ) { switch ( sqmJoin.getSqmJoinType() ) { case LEFT: final EntityAssociationMapping associationMapping = resolveAssociationMapping( sqmJoin ); @@ -253,8 +248,7 @@ public class SqmUtil { * or one that has an explicit on clause predicate. */ public static boolean isFkOptimizationAllowed(SqmPath sqmPath, EntityAssociationMapping associationMapping) { - if ( sqmPath instanceof SqmJoin ) { - final SqmJoin sqmJoin = (SqmJoin) sqmPath; + if ( sqmPath instanceof SqmJoin sqmJoin ) { switch ( sqmJoin.getSqmJoinType() ) { case LEFT: if ( isFiltered( associationMapping ) ) { @@ -279,8 +273,7 @@ public class SqmUtil { } private static @Nullable EntityAssociationMapping resolveAssociationMapping(SqmJoin sqmJoin) { - if ( sqmJoin instanceof SqmSingularJoin ) { - final SqmSingularJoin singularJoin = (SqmSingularJoin) sqmJoin; + if ( sqmJoin instanceof SqmSingularJoin singularJoin ) { if ( singularJoin.getAttribute().getSqmPathType() instanceof EntityDomainType ) { return resolveAssociationMapping( singularJoin ); } @@ -294,7 +287,7 @@ public class SqmUtil { if ( declaringType.getPersistenceType() != Type.PersistenceType.ENTITY ) { final StringBuilder pathBuilder = new StringBuilder(); do { - if ( pathBuilder.length() > 0 ) { + if ( !pathBuilder.isEmpty() ) { pathBuilder.insert(0, '.'); } pathBuilder.insert( 0, attribute.getName() ); @@ -489,8 +482,6 @@ public class SqmUtil { QueryParameterBindings domainParamBindings, DomainParameterXref domainParameterXref, Map, Map, List>> jdbcParamXref, - MappingMetamodel domainModel, - Function tableGroupLocator, SqmParameterMappingModelResolutionAccess mappingModelResolutionAccess, SharedSessionContractImplementor session) { final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl( @@ -506,8 +497,8 @@ public class SqmUtil { final Map, List> jdbcParamMap = jdbcParamXref.get( queryParam ); for ( SqmParameter sqmParameter : sqmParameters ) { - final MappingModelExpressible resolvedMappingModelType = mappingModelResolutionAccess - .getResolvedMappingModelType( sqmParameter ); + final MappingModelExpressible resolvedMappingModelType = + mappingModelResolutionAccess.getResolvedMappingModelType( sqmParameter ); if ( resolvedMappingModelType != null ) { domainParamBinding.setType( resolvedMappingModelType ); } @@ -529,12 +520,9 @@ public class SqmUtil { for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) { final JdbcParametersList jdbcParams = jdbcParamsBinds.get( i ); parameterType.forEachJdbcType( - (position, jdbcMapping) -> { - jdbcParameterBindings.addBinding( - jdbcParams.get( position ), - new JdbcParameterBindingImpl( jdbcMapping, null ) - ); - } + (position, jdbcMapping) -> + jdbcParameterBindings.addBinding( jdbcParams.get( position ), + new JdbcParameterBindingImpl( jdbcMapping, null ) ) ); } } @@ -553,7 +541,6 @@ public class SqmUtil { parameterType, jdbcParams, firstValue, - tableGroupLocator, session ); } @@ -578,7 +565,6 @@ public class SqmUtil { parameterType, expansionJdbcParams, expandedValue, - tableGroupLocator, session ); } @@ -626,7 +612,6 @@ public class SqmUtil { } } else { - for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) { final JdbcParametersList jdbcParams = jdbcParamsBinds.get( i ); createValueBindings( @@ -636,7 +621,6 @@ public class SqmUtil { parameterType, jdbcParams, bindValue, - tableGroupLocator, session ); } @@ -656,7 +640,6 @@ public class SqmUtil { Bindable parameterType, JdbcParametersList jdbcParams, Object bindValue, - Function tableGroupLocator, SharedSessionContractImplementor session) { if ( parameterType == null ) { throw new SqlTreeCreationException( "Unable to interpret mapping-model type for Query parameter : " + domainParam ); @@ -666,8 +649,7 @@ public class SqmUtil { parameterType = ( (PluralAttributeMapping) parameterType ).getElementDescriptor(); } - if ( parameterType instanceof EntityIdentifierMapping ) { - final EntityIdentifierMapping identifierMapping = (EntityIdentifierMapping) parameterType; + if ( parameterType instanceof EntityIdentifierMapping identifierMapping ) { final EntityMappingType entityMapping = identifierMapping.findContainingEntityMapping(); if ( entityMapping.getRepresentationStrategy().getInstantiator().isInstance( bindValue, session.getFactory() ) ) { bindValue = identifierMapping.getIdentifierIfNotUnsaved( bindValue, session ); @@ -681,8 +663,7 @@ public class SqmUtil { bindValue = identifierMapping.getIdentifierIfNotUnsaved( bindValue, session ); } } - else if ( parameterType instanceof EntityAssociationMapping ) { - EntityAssociationMapping association = (EntityAssociationMapping) parameterType; + else if ( parameterType instanceof EntityAssociationMapping association ) { if ( association.getSideNature() == ForeignKeyDescriptor.Nature.TARGET ) { // If the association is the target, we must use the identifier of the EntityMappingType bindValue = association.getAssociatedEntityMappingType().getIdentifierMapping() @@ -763,12 +744,12 @@ public class SqmUtil { return null; } //There's a high chance that we're dealing with a BasicTypeImpl, or a subclass of it. - else if ( o instanceof BasicTypeImpl ) { - return (BasicTypeImpl) o; + else if ( o instanceof BasicTypeImpl basicType ) { + return basicType; } //Alternatively, chances are good that we're dealing with an ConvertedBasicTypeImpl. - else if ( o instanceof ConvertedBasicTypeImpl ) { - return (ConvertedBasicTypeImpl) o; + else if ( o instanceof ConvertedBasicTypeImpl convertedBasicType ) { + return convertedBasicType; } else { //Eventually fallback to the standard check for completeness: @@ -826,8 +807,7 @@ public class SqmUtil { else { // ordering by an attribute of the returned entity if ( items.size() == 1) { - if ( selected instanceof SqmRoot) { - final SqmFrom root = (SqmFrom) selected; + if ( selected instanceof SqmFrom root ) { if ( !order.getEntityClass().isAssignableFrom( root.getJavaType() ) ) { throw new IllegalQueryOperationException("Select item was of wrong entity type"); } @@ -884,12 +864,11 @@ public class SqmUtil { sqmParameters = new LinkedHashSet<>(); } - if ( parameter instanceof SqmJpaCriteriaParameterWrapper ) { + if ( parameter instanceof SqmJpaCriteriaParameterWrapper wrapper ) { if ( jpaCriteriaParamResolutions == null ) { jpaCriteriaParamResolutions = new IdentityHashMap<>(); } - final SqmJpaCriteriaParameterWrapper wrapper = (SqmJpaCriteriaParameterWrapper) parameter; final JpaCriteriaParameter criteriaParameter = wrapper.getJpaCriteriaParameter(); final List> sqmParametersForCriteriaParameter = jpaCriteriaParamResolutions.computeIfAbsent( @@ -1059,9 +1038,8 @@ public class SqmUtil { // See if the selected type can be used to instantiate the expected-type final JavaType javaTypeDescriptor = selectableNode.getJavaTypeDescriptor(); if ( javaTypeDescriptor != null ) { - final Class selectedJavaType = javaTypeDescriptor.getJavaTypeClass(); // ignore the exception if the expected type has a constructor accepting the selected item type - if ( hasMatchingConstructor( expectedResultClass, selectedJavaType ) ) { + if ( hasMatchingConstructor( expectedResultClass, javaTypeDescriptor.getJavaTypeClass() ) ) { // ignore it } else { @@ -1086,8 +1064,7 @@ public class SqmUtil { JpaCompliance jpaCompliance, SqmSelectableNode selection) { // special case for parameters in the select list - if ( selection instanceof SqmParameter ) { - final SqmParameter sqmParameter = (SqmParameter) selection; + if ( selection instanceof SqmParameter sqmParameter ) { final SqmExpressible nodeType = sqmParameter.getExpressible(); // we may not yet know a selection type if ( nodeType == null || nodeType.getExpressibleJavaType() == null ) { @@ -1120,17 +1097,13 @@ public class SqmUtil { assert selectionExpressibleJavaType != null; final Class selectionExpressibleJavaTypeClass = selectionExpressibleJavaType.getJavaTypeClass(); - if ( selectionExpressibleJavaTypeClass == Object.class ) { - - } if ( selectionExpressibleJavaTypeClass != Object.class ) { // performs a series of opt-out checks for validity... each if branch and return indicates a valid case if ( resultClass.isAssignableFrom( selectionExpressibleJavaTypeClass ) ) { return; } - if ( selectionExpressibleJavaType instanceof PrimitiveJavaType ) { - final PrimitiveJavaType primitiveJavaType = (PrimitiveJavaType) selectionExpressibleJavaType; + if ( selectionExpressibleJavaType instanceof PrimitiveJavaType primitiveJavaType ) { if ( primitiveJavaType.getPrimitiveClass() == resultClass ) { return; } @@ -1149,13 +1122,11 @@ public class SqmUtil { } private static boolean isEntityIdType(SqmExpressible selectionExpressible, Class resultClass) { - if ( selectionExpressible instanceof IdentifiableDomainType ) { - final IdentifiableDomainType identifiableDomainType = (IdentifiableDomainType) selectionExpressible; + if ( selectionExpressible instanceof IdentifiableDomainType identifiableDomainType ) { final SimpleDomainType idType = identifiableDomainType.getIdType(); return resultClass.isAssignableFrom( idType.getBindableJavaType() ); } - else if ( selectionExpressible instanceof EntitySqmPathSource ) { - final EntitySqmPathSource entityPath = (EntitySqmPathSource) selectionExpressible; + else if ( selectionExpressible instanceof EntitySqmPathSource entityPath ) { final EntityDomainType entityType = entityPath.getSqmPathType(); final SimpleDomainType idType = entityType.getIdType(); return resultClass.isAssignableFrom( idType.getBindableJavaType() ); @@ -1178,8 +1149,7 @@ public class SqmUtil { if ( sqmExpressible instanceof BasicDomainType ) { return ( (BasicDomainType) sqmExpressible).getJdbcType(); } - else if ( sqmExpressible instanceof SqmPathSource ) { - final SqmPathSource pathSource = (SqmPathSource) sqmExpressible; + else if ( sqmExpressible instanceof SqmPathSource pathSource ) { final DomainType domainType = pathSource.getSqmPathType(); if ( domainType instanceof BasicDomainType ) { return ( (BasicDomainType) domainType ).getJdbcType(); @@ -1190,16 +1160,12 @@ public class SqmUtil { private static boolean isMatchingDateJdbcType(Class resultClass, JdbcType jdbcType) { if ( jdbcType != null ) { - switch ( jdbcType.getDefaultSqlTypeCode() ) { - case Types.DATE: - return resultClass.isAssignableFrom( java.sql.Date.class ); - case Types.TIME: - return resultClass.isAssignableFrom( java.sql.Time.class ); - case Types.TIMESTAMP: - return resultClass.isAssignableFrom( java.sql.Timestamp.class ); - default: - return false; - } + return switch ( jdbcType.getDefaultSqlTypeCode() ) { + case Types.DATE -> resultClass.isAssignableFrom(java.sql.Date.class); + case Types.TIME -> resultClass.isAssignableFrom(java.sql.Time.class); + case Types.TIMESTAMP -> resultClass.isAssignableFrom(java.sql.Timestamp.class); + default -> false; + }; } else { return false; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java index 39457afedd..8329330e9c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java @@ -38,9 +38,7 @@ import org.hibernate.query.sqm.tree.select.SqmSelectClause; import org.hibernate.query.sqm.tree.select.SqmSelectStatement; import org.hibernate.sql.ast.SqlAstJoinType; import org.hibernate.sql.ast.SqlAstTranslator; -import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableReference; import org.hibernate.sql.ast.tree.predicate.Predicate; import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.ast.tree.select.SelectStatement; @@ -50,7 +48,6 @@ import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.basic.BasicResult; import org.hibernate.sql.results.internal.RowTransformerArrayImpl; import org.hibernate.sql.results.internal.RowTransformerSingularReturnImpl; -import org.hibernate.sql.results.internal.SqlSelectionImpl; import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.RowTransformer; @@ -76,13 +73,12 @@ public class MatchingIdSelectionHelper { */ public static SelectStatement generateMatchingIdSelectStatement( EntityMappingType targetEntityDescriptor, - SqmDeleteOrUpdateStatement sqmStatement, + SqmDeleteOrUpdateStatement sqmStatement, boolean queryRoot, Predicate restriction, MultiTableSqmMutationConverter sqmConverter, - DomainQueryExecutionContext executionContext, - SessionFactoryImplementor sessionFactory) { - final EntityDomainType entityDomainType = sqmStatement.getTarget().getModel(); + DomainQueryExecutionContext executionContext) { + final EntityDomainType entityDomainType = sqmStatement.getTarget().getModel(); if ( log.isTraceEnabled() ) { log.tracef( "Starting generation of entity-id SQM selection - %s", @@ -110,15 +106,14 @@ public class MatchingIdSelectionHelper { mutatingTableGroup.getNavigablePath(), mutatingTableGroup, sqmConverter, - (selection, jdbcMapping) -> { - domainResults.add( - new BasicResult<>( - selection.getValuesArrayPosition(), - null, - jdbcMapping - ) - ); - } + (selection, jdbcMapping) -> + domainResults.add( + new BasicResult<>( + selection.getValuesArrayPosition(), + null, + jdbcMapping + ) + ) ); sqmConverter.getProcessingStateStack().pop(); @@ -152,14 +147,14 @@ public class MatchingIdSelectionHelper { sqmQuerySpec.setFromClause( new SqmFromClause( 1 ) ); sqmQuerySpec.addRoot( sqmStatement.getTarget() ); sqmQuerySpec.setSelectClause( new SqmSelectClause( false, 1, sqmQuerySpec.nodeBuilder() ) ); - entityDescriptor.getIdentifierMapping().forEachSelectable( 0, (selectionIndex, selectableMapping) -> { - sqmQuerySpec.getSelectClause().addSelection( - SelectableMappingExpressionConverter.forSelectableMapping( - sqmStatement.getTarget(), - selectableMapping - ) - ); - } ); + entityDescriptor.getIdentifierMapping() + .forEachSelectable( 0, (selectionIndex, selectableMapping) -> + sqmQuerySpec.getSelectClause().addSelection( + SelectableMappingExpressionConverter.forSelectableMapping( + sqmStatement.getTarget(), + selectableMapping + ) + )); sqmQuerySpec.setWhereClause( sqmStatement.getWhereClause() ); return new SqmSelectStatement<>( @@ -169,59 +164,59 @@ public class MatchingIdSelectionHelper { nodeBuilder ); } - - /** - * @asciidoc - * - * Generates a query-spec for selecting all ids matching the restriction defined as part - * of the user's update/delete query. This query-spec is generally used: - * - * * to select all the matching ids via JDBC - see {@link MatchingIdSelectionHelper#selectMatchingIds} - * * as a sub-query restriction to insert rows into an "id table" - */ - public static QuerySpec generateMatchingIdSelectQuery( - EntityMappingType targetEntityDescriptor, - SqmDeleteOrUpdateStatement sqmStatement, - DomainParameterXref domainParameterXref, - Predicate restriction, - MultiTableSqmMutationConverter sqmConverter, - SessionFactoryImplementor sessionFactory) { - final EntityDomainType entityDomainType = sqmStatement.getTarget().getModel(); - if ( log.isTraceEnabled() ) { - log.tracef( - "Starting generation of entity-id SQM selection - %s", - entityDomainType.getHibernateEntityName() - ); - } - - final QuerySpec idSelectionQuery = new QuerySpec( true, 1 ); - - final TableGroup mutatingTableGroup = sqmConverter.getMutatingTableGroup(); - idSelectionQuery.getFromClause().addRoot( mutatingTableGroup ); - - targetEntityDescriptor.getIdentifierMapping().forEachSelectable( - (position, selection) -> { - final TableReference tableReference = mutatingTableGroup.resolveTableReference( - mutatingTableGroup.getNavigablePath(), - selection.getContainingTableExpression() - ); - final Expression expression = sqmConverter.getSqlExpressionResolver().resolveSqlExpression( - tableReference, - selection - ); - idSelectionQuery.getSelectClause().addSqlSelection( - new SqlSelectionImpl( - position, - expression - ) - ); - } - ); - - idSelectionQuery.applyPredicate( restriction ); - - return idSelectionQuery; - } +// +// /** +// * @asciidoc +// * +// * Generates a query-spec for selecting all ids matching the restriction defined as part +// * of the user's update/delete query. This query-spec is generally used: +// * +// * * to select all the matching ids via JDBC - see {@link MatchingIdSelectionHelper#selectMatchingIds} +// * * as a sub-query restriction to insert rows into an "id table" +// */ +// public static QuerySpec generateMatchingIdSelectQuery( +// EntityMappingType targetEntityDescriptor, +// SqmDeleteOrUpdateStatement sqmStatement, +// DomainParameterXref domainParameterXref, +// Predicate restriction, +// MultiTableSqmMutationConverter sqmConverter, +// SessionFactoryImplementor sessionFactory) { +// final EntityDomainType entityDomainType = sqmStatement.getTarget().getModel(); +// if ( log.isTraceEnabled() ) { +// log.tracef( +// "Starting generation of entity-id SQM selection - %s", +// entityDomainType.getHibernateEntityName() +// ); +// } +// +// final QuerySpec idSelectionQuery = new QuerySpec( true, 1 ); +// +// final TableGroup mutatingTableGroup = sqmConverter.getMutatingTableGroup(); +// idSelectionQuery.getFromClause().addRoot( mutatingTableGroup ); +// +// targetEntityDescriptor.getIdentifierMapping().forEachSelectable( +// (position, selection) -> { +// final TableReference tableReference = mutatingTableGroup.resolveTableReference( +// mutatingTableGroup.getNavigablePath(), +// selection.getContainingTableExpression() +// ); +// final Expression expression = sqmConverter.getSqlExpressionResolver().resolveSqlExpression( +// tableReference, +// selection +// ); +// idSelectionQuery.getSelectClause().addSqlSelection( +// new SqlSelectionImpl( +// position, +// expression +// ) +// ); +// } +// ); +// +// idSelectionQuery.applyPredicate( restriction ); +// +// return idSelectionQuery; +// } /** * Centralized selection of ids matching the restriction of the DELETE @@ -243,22 +238,20 @@ public class MatchingIdSelectionHelper { // For delete statements we also want to collect FK values to execute collection table cleanups entityDescriptor.visitSubTypeAttributeMappings( attribute -> { - if ( attribute instanceof PluralAttributeMapping ) { - final PluralAttributeMapping pluralAttribute = (PluralAttributeMapping) attribute; - + if ( attribute instanceof PluralAttributeMapping pluralAttribute ) { if ( pluralAttribute.getSeparateCollectionTable() != null ) { // Ensure that the FK target columns are available final ValuedModelPart targetPart = pluralAttribute.getKeyDescriptor().getTargetPart(); final boolean useFkTarget = !targetPart.isEntityIdentifierMapping(); if ( useFkTarget ) { - targetPart.forEachSelectable( 0, (selectionIndex, selectableMapping) -> { - sqmQuerySpec.getSelectClause().addSelection( - SelectableMappingExpressionConverter.forSelectableMapping( - sqmMutationStatement.getTarget(), - selectableMapping - ) - ); - } ); + targetPart.forEachSelectable( 0, (selectionIndex, selectableMapping) -> + sqmQuerySpec.getSelectClause().addSelection( + SelectableMappingExpressionConverter.forSelectableMapping( + sqmMutationStatement.getTarget(), + selectableMapping + ) + ) + ); } } } @@ -288,8 +281,6 @@ public class MatchingIdSelectionHelper { executionContext.getQueryParameterBindings(), domainParameterXref, SqmUtil.generateJdbcParamsXref( domainParameterXref, translator ), - factory.getRuntimeMetamodels().getMappingMetamodel(), - translation.getFromClauseAccess()::findTableGroup, new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/AbstractCteMutationHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/AbstractCteMutationHandler.java index 430a312302..8b3dd2c816 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/AbstractCteMutationHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/AbstractCteMutationHandler.java @@ -9,7 +9,6 @@ package org.hibernate.query.sqm.mutation.internal.cte; import java.util.ArrayList; import java.util.Collections; import java.util.IdentityHashMap; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -101,8 +100,7 @@ public abstract class AbstractCteMutationHandler extends AbstractMutationHandler @Override public int execute(DomainQueryExecutionContext executionContext) { - //noinspection rawtypes - final SqmDeleteOrUpdateStatement sqmMutationStatement = getSqmDeleteOrUpdateStatement(); + final SqmDeleteOrUpdateStatement sqmMutationStatement = getSqmDeleteOrUpdateStatement(); final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); final EntityMappingType entityDescriptor = getEntityDescriptor(); final String explicitDmlTargetAlias; @@ -144,8 +142,7 @@ public abstract class AbstractCteMutationHandler extends AbstractMutationHandler true, restriction, sqmConverter, - executionContext, - factory + executionContext ), // The id-select cte will be reused multiple times CteMaterialization.MATERIALIZED @@ -186,8 +183,6 @@ public abstract class AbstractCteMutationHandler extends AbstractMutationHandler executionContext.getQueryParameterBindings(), domainParameterXref, SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmConverter ), - factory.getRuntimeMetamodels().getMappingMetamodel(), - navigablePath -> sqmConverter.getMutatingTableGroup(), new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertHandler.java index 26f0890184..2b9ac49378 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertHandler.java @@ -70,7 +70,6 @@ import org.hibernate.sql.ast.tree.cte.CteTableGroup; import org.hibernate.sql.ast.tree.expression.BinaryArithmeticExpression; import org.hibernate.sql.ast.tree.expression.ColumnReference; import org.hibernate.sql.ast.tree.expression.Expression; -import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.expression.QueryLiteral; import org.hibernate.sql.ast.tree.expression.SelfRenderingSqlFragmentExpression; import org.hibernate.sql.ast.tree.expression.SqlTuple; @@ -557,7 +556,6 @@ public class CteInsertHandler implements InsertHandler { targetPathColumns, assignsId, sqmConverter, - sqmConverter.getJdbcParamsBySqmParam(), factory ); @@ -588,9 +586,7 @@ public class CteInsertHandler implements InsertHandler { final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( executionContext.getQueryParameterBindings(), domainParameterXref, - SqmUtil.generateJdbcParamsXref(domainParameterXref, sqmConverter), - factory.getRuntimeMetamodels().getMappingMetamodel(), - navigablePath -> sqmConverter.getMutatingTableGroup(), + SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmConverter ), new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { @@ -631,7 +627,6 @@ public class CteInsertHandler implements InsertHandler { List, Assignment>> assignments, boolean assignsId, MultiTableSqmMutationConverter sqmConverter, - Map, List>> parameterResolutions, SessionFactoryImplementor factory) { final TableGroup updatingTableGroup = sqmConverter.getMutatingTableGroup(); final EntityMappingType entityDescriptor = getEntityDescriptor(); @@ -672,11 +667,7 @@ public class CteInsertHandler implements InsertHandler { for ( int c = 0; c < assignmentColumnRefs.size(); c++ ) { final ColumnReference columnReference = assignmentColumnRefs.get( c ); - final TableReference tableReference = resolveTableReference( - columnReference, - updatingTableGroup, - tableReferenceByAlias - ); + final TableReference tableReference = resolveTableReference( columnReference, tableReferenceByAlias ); // TODO: this could be fixed by introducing joins to DML statements if ( assignmentTableReference != null && !assignmentTableReference.equals( tableReference ) ) { @@ -1372,7 +1363,6 @@ public class CteInsertHandler implements InsertHandler { private TableReference resolveTableReference( ColumnReference columnReference, - TableGroup updatingTableGroup, Map tableReferenceByAlias) { final TableReference tableReferenceByQualifier = tableReferenceByAlias.get( columnReference.getQualifier() ); if ( tableReferenceByQualifier != null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/inline/InlineUpdateHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/inline/InlineUpdateHandler.java index 3e42305817..046da54519 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/inline/InlineUpdateHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/inline/InlineUpdateHandler.java @@ -131,12 +131,7 @@ public class InlineUpdateHandler implements UpdateHandler { final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( executionContext.getQueryParameterBindings(), domainParameterXref, - SqmUtil.generateJdbcParamsXref( - domainParameterXref, - translation::getJdbcParamsBySqmParam - ), - sessionFactory.getRuntimeMetamodels().getMappingMetamodel(), - navigablePath -> updatingTableGroup, + SqmUtil.generateJdbcParamsXref( domainParameterXref, translation::getJdbcParamsBySqmParam ), new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java index 49b6ff394b..fea490c555 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java @@ -39,7 +39,6 @@ import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.MappingModelExpressible; import org.hibernate.metamodel.mapping.ModelPartContainer; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.persister.entity.mutation.EntityMutationTarget; import org.hibernate.query.SemanticException; import org.hibernate.query.SortDirection; import org.hibernate.query.results.TableGroupImpl; @@ -51,7 +50,6 @@ import org.hibernate.query.sqm.internal.SqmUtil; import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter; import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess; import org.hibernate.query.sqm.tree.expression.SqmParameter; -import org.hibernate.query.sqm.tree.insert.SqmInsertStatement; import org.hibernate.sql.ast.tree.expression.ColumnReference; import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.expression.QueryLiteral; @@ -77,7 +75,6 @@ import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.results.graph.basic.BasicFetch; -import org.hibernate.sql.results.graph.basic.BasicResultAssembler; import org.hibernate.sql.results.internal.SqlSelectionImpl; import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.type.descriptor.ValueBinder; @@ -89,12 +86,9 @@ import static org.hibernate.generator.EventType.INSERT; * @author Steve Ebersole */ public class InsertExecutionDelegate implements TableBasedInsertHandler.ExecutionDelegate { - private final SqmInsertStatement sqmInsert; - private final MultiTableSqmMutationConverter sqmConverter; private final TemporaryTable entityTable; private final AfterUseAction afterUseAction; private final Function sessionUidAccess; - private final DomainParameterXref domainParameterXref; private final TableGroup updatingTableGroup; private final InsertSelectStatement insertStatement; private final ConflictClause conflictClause; @@ -108,7 +102,6 @@ public class InsertExecutionDelegate implements TableBasedInsertHandler.Executio private final SessionFactoryImplementor sessionFactory; public InsertExecutionDelegate( - SqmInsertStatement sqmInsert, MultiTableSqmMutationConverter sqmConverter, TemporaryTable entityTable, AfterUseAction afterUseAction, @@ -121,12 +114,9 @@ public class InsertExecutionDelegate implements TableBasedInsertHandler.Executio ConflictClause conflictClause, JdbcParameter sessionUidParameter, DomainQueryExecutionContext executionContext) { - this.sqmInsert = sqmInsert; - this.sqmConverter = sqmConverter; this.entityTable = entityTable; this.afterUseAction = afterUseAction; this.sessionUidAccess = sessionUidAccess; - this.domainParameterXref = domainParameterXref; this.updatingTableGroup = insertingTableGroup; this.conflictClause = conflictClause; this.sessionUidParameter = sessionUidParameter; @@ -144,12 +134,7 @@ public class InsertExecutionDelegate implements TableBasedInsertHandler.Executio jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( executionContext.getQueryParameterBindings(), domainParameterXref, - SqmUtil.generateJdbcParamsXref( - domainParameterXref, - sqmConverter::getJdbcParamsBySqmParam - ), - sessionFactory.getRuntimeMetamodels().getMappingMetamodel(), - navigablePath -> insertingTableGroup, + SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmConverter ), new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { @@ -173,11 +158,7 @@ public class InsertExecutionDelegate implements TableBasedInsertHandler.Executio for ( int c = 0; c < assignmentColumnRefs.size(); c++ ) { final ColumnReference columnReference = assignmentColumnRefs.get( c ); - final TableReference tableReference = resolveTableReference( - columnReference, - insertingTableGroup, - tableReferenceByAlias - ); + final TableReference tableReference = resolveTableReference( columnReference, tableReferenceByAlias ); if ( assignmentTableReference != null && assignmentTableReference != tableReference ) { throw new SemanticException( "Assignment referred to columns from multiple tables: " + i ); @@ -274,7 +255,6 @@ public class InsertExecutionDelegate implements TableBasedInsertHandler.Executio private TableReference resolveTableReference( ColumnReference columnReference, - TableGroup updatingTableGroup, Map tableReferenceByAlias) { if ( columnReference.getQualifier() == null ) { // This happens only for the special row_number column @@ -566,9 +546,9 @@ public class InsertExecutionDelegate implements TableBasedInsertHandler.Executio .translate( null, executionContext.getQueryOptions() ); if ( generator.generatedOnExecution() ) { - final GeneratedValuesMutationDelegate insertDelegate = ( (EntityMutationTarget) entityDescriptor.getEntityPersister() ).getInsertDelegate(); + final GeneratedValuesMutationDelegate insertDelegate = entityDescriptor.getEntityPersister().getInsertDelegate(); // todo 7.0 : InsertGeneratedIdentifierDelegate will be removed once we're going to handle - // generated values within the jdbc insert operaetion itself + // generated values within the jdbc insert operaetion itself final InsertGeneratedIdentifierDelegate identifierDelegate = (InsertGeneratedIdentifierDelegate) insertDelegate; final String finalSql = identifierDelegate.prepareIdentifierGeneratingInsert( jdbcInsert.getSqlString() ); final BasicEntityIdentifierMapping identifierMapping = diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/RestrictedDeleteExecutionDelegate.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/RestrictedDeleteExecutionDelegate.java index 8f02c3de1c..c2fc2dd4f7 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/RestrictedDeleteExecutionDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/RestrictedDeleteExecutionDelegate.java @@ -140,7 +140,6 @@ public class RestrictedDeleteExecutionDelegate extends AbstractDeleteExecutionDe if ( needsIdTable ) { return executeWithIdTable( predicateCollector.getPredicate(), - deletingTableGroup, getConverter().getJdbcParamsBySqmParam(), getConverter().getSqmParameterMappingModelExpressibleResolutions(), executionContextAdapter @@ -190,8 +189,6 @@ public class RestrictedDeleteExecutionDelegate extends AbstractDeleteExecutionDe getDomainParameterXref(), () -> restrictionSqmParameterResolutions ), - getSessionFactory().getRuntimeMetamodels().getMappingMetamodel(), - navigablePath -> tableGroup, new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { @@ -425,7 +422,6 @@ public class RestrictedDeleteExecutionDelegate extends AbstractDeleteExecutionDe private int executeWithIdTable( Predicate predicate, - TableGroup deletingTableGroup, Map, List>> restrictionSqmParameterResolutions, Map, MappingModelExpressible> paramTypeResolutions, ExecutionContext executionContext) { @@ -436,8 +432,6 @@ public class RestrictedDeleteExecutionDelegate extends AbstractDeleteExecutionDe getDomainParameterXref(), () -> restrictionSqmParameterResolutions ), - getSessionFactory().getRuntimeMetamodels().getMappingMetamodel(), - navigablePath -> deletingTableGroup, new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/SoftDeleteExecutionDelegate.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/SoftDeleteExecutionDelegate.java index ea9d3738b0..beaccedf9b 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/SoftDeleteExecutionDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/SoftDeleteExecutionDelegate.java @@ -7,7 +7,6 @@ package org.hibernate.query.sqm.mutation.internal.temptable; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.function.Function; @@ -53,6 +52,7 @@ import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.results.internal.SqlSelectionImpl; +import static java.util.Collections.singletonList; import static org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter.omittingLockingAndPaging; /** @@ -133,12 +133,7 @@ public class SoftDeleteExecutionDelegate extends AbstractDeleteExecutionDelegate final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( executionContext.getQueryParameterBindings(), getDomainParameterXref(), - SqmUtil.generateJdbcParamsXref( - getDomainParameterXref(), - getConverter()::getJdbcParamsBySqmParam - ), - getSessionFactory().getRuntimeMetamodels().getMappingMetamodel(), - navigablePath -> deletingTableGroup, + SqmUtil.generateJdbcParamsXref( getDomainParameterXref(), getConverter() ), new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { @@ -153,7 +148,6 @@ public class SoftDeleteExecutionDelegate extends AbstractDeleteExecutionDelegate if ( needsSubQuery ) { if ( getSessionFactory().getJdbcServices().getDialect().supportsSubqueryOnMutatingTable() ) { return performDeleteWithSubQuery( - targetEntityDescriptor, rootEntityDescriptor, deletingTableGroup, rootTableReference, @@ -175,13 +169,10 @@ public class SoftDeleteExecutionDelegate extends AbstractDeleteExecutionDelegate } else { return performDirectDelete( - targetEntityDescriptor, rootEntityDescriptor, - deletingTableGroup, rootTableReference, predicateCollector, jdbcParameterBindings, - getConverter(), executionContext ); } @@ -293,7 +284,7 @@ public class SoftDeleteExecutionDelegate extends AbstractDeleteExecutionDelegate final UpdateStatement updateStatement = new UpdateStatement( targetTableReference, - Collections.singletonList( softDeleteAssignment ), + singletonList( softDeleteAssignment ), new InSubQueryPredicate( idExpression, idTableIdentifierSubQuery, false ) ); @@ -303,7 +294,6 @@ public class SoftDeleteExecutionDelegate extends AbstractDeleteExecutionDelegate } private int performDeleteWithSubQuery( - EntityMappingType targetEntityDescriptor, EntityMappingType rootEntityDescriptor, TableGroup deletingTableGroup, NamedTableReference rootTableReference, @@ -347,7 +337,7 @@ public class SoftDeleteExecutionDelegate extends AbstractDeleteExecutionDelegate final UpdateStatement updateStatement = new UpdateStatement( targetTable, - Collections.singletonList( softDeleteAssignment ), + singletonList( softDeleteAssignment ), new InSubQueryPredicate( idExpression, matchingIdSubQuery, false ) ); @@ -355,13 +345,10 @@ public class SoftDeleteExecutionDelegate extends AbstractDeleteExecutionDelegate } private int performDirectDelete( - EntityMappingType targetEntityDescriptor, EntityMappingType rootEntityDescriptor, - TableGroup deletingTableGroup, NamedTableReference rootTableReference, PredicateCollector predicateCollector, JdbcParameterBindings jdbcParameterBindings, - MultiTableSqmMutationConverter converter, SqmJdbcExecutionContextAdapter executionContext) { final Assignment softDeleteAssignment = SoftDeleteHelper.createSoftDeleteAssignment( rootTableReference, @@ -370,7 +357,7 @@ public class SoftDeleteExecutionDelegate extends AbstractDeleteExecutionDelegate final UpdateStatement updateStatement = new UpdateStatement( rootTableReference, - Collections.singletonList( softDeleteAssignment ), + singletonList( softDeleteAssignment ), predicateCollector.getPredicate() ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java index fad762a5c3..f1918afc18 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java @@ -334,7 +334,6 @@ public class TableBasedInsertHandler implements InsertHandler { JdbcParameter sessionUidParameter, DomainQueryExecutionContext executionContext) { return new InsertExecutionDelegate( - sqmInsertStatement, sqmConverter, entityTable, afterUseAction, diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/UpdateExecutionDelegate.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/UpdateExecutionDelegate.java index 9ad9b985ed..ee95537c3c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/UpdateExecutionDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/UpdateExecutionDelegate.java @@ -19,7 +19,6 @@ import org.hibernate.dialect.temptable.TemporaryTable; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.MappingModelExpressible; import org.hibernate.metamodel.mapping.ModelPartContainer; @@ -40,7 +39,6 @@ import org.hibernate.sql.ast.SqlAstTranslatorFactory; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.tree.expression.ColumnReference; import org.hibernate.sql.ast.tree.expression.Expression; -import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.expression.QueryLiteral; import org.hibernate.sql.ast.tree.expression.SqlTuple; import org.hibernate.sql.ast.tree.from.NamedTableReference; @@ -58,12 +56,12 @@ import org.hibernate.sql.ast.tree.update.Assignment; import org.hibernate.sql.ast.tree.update.UpdateStatement; import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcMutationExecutor; -import org.hibernate.sql.exec.spi.JdbcOperationQueryInsert; import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; -import org.hibernate.sql.exec.spi.JdbcOperationQueryUpdate; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.results.internal.SqlSelectionImpl; +import static org.hibernate.internal.util.collections.CollectionHelper.mapOfSize; + /** * @author Steve Ebersole */ @@ -121,17 +119,12 @@ public class UpdateExecutionDelegate implements TableBasedUpdateHandler.Executio - this.assignmentsByTable = CollectionHelper.mapOfSize( updatingTableGroup.getTableReferenceJoins().size() + 1 ); + this.assignmentsByTable = mapOfSize( updatingTableGroup.getTableReferenceJoins().size() + 1 ); jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( executionContext.getQueryParameterBindings(), domainParameterXref, - SqmUtil.generateJdbcParamsXref( - domainParameterXref, - sqmConverter::getJdbcParamsBySqmParam - ), - sessionFactory.getRuntimeMetamodels().getMappingMetamodel(), - navigablePath -> updatingTableGroup, + SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmConverter ), new SqmParameterMappingModelResolutionAccess() { @Override @SuppressWarnings("unchecked") public MappingModelExpressible getResolvedMappingModelType(SqmParameter parameter) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java index 37ac90a56b..73a29eee7c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java @@ -13,7 +13,6 @@ import org.hibernate.Internal; import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.JdbcMappingContainer; -import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.query.sqm.tree.expression.SqmCollation; @@ -132,9 +131,7 @@ public class ArgumentTypesValidator implements ArgumentsValidator { FunctionParameterType type, JavaType javaType) { if ( !isUnknown( javaType ) ) { - DomainType domainType = argument.getExpressible().getSqmType(); - if ( domainType instanceof JdbcMapping ) { - JdbcMapping jdbcMapping = (JdbcMapping) domainType; + if ( argument.getExpressible().getSqmType() instanceof JdbcMapping jdbcMapping ) { checkArgumentType( count, functionName, type, jdbcMapping.getJdbcType(), @@ -181,8 +178,7 @@ public class ArgumentTypesValidator implements ArgumentsValidator { public void validateSqlTypes(List arguments, String functionName) { int count = 0; for ( SqlAstNode argument : arguments ) { - if ( argument instanceof Expression ) { - final Expression expression = (Expression) argument; + if ( argument instanceof Expression expression ) { final JdbcMappingContainer expressionType = expression.getExpressionType(); if (expressionType != null) { if ( isUnknownExpressionType( expressionType ) ) { @@ -240,34 +236,22 @@ public class ArgumentTypesValidator implements ArgumentsValidator { @Internal private static boolean isCompatible(FunctionParameterType type, JdbcType jdbcType) { - switch ( type ) { - case COMPARABLE: - return jdbcType.isComparable(); - case STRING: - return jdbcType.isStringLikeExcludingClob(); - case STRING_OR_CLOB: - return jdbcType.isString(); // should it be isStringLike() - case NUMERIC: - return jdbcType.isNumber(); - case INTEGER: - return jdbcType.isInteger(); - case BOOLEAN: - return jdbcType.isBoolean() + return switch (type) { + case COMPARABLE -> jdbcType.isComparable(); + case STRING -> jdbcType.isStringLikeExcludingClob(); + case STRING_OR_CLOB -> jdbcType.isString(); // should it be isStringLike() + case NUMERIC -> jdbcType.isNumber(); + case INTEGER -> jdbcType.isInteger(); + case BOOLEAN -> jdbcType.isBoolean() // some Dialects map Boolean to SMALLINT or TINYINT // TODO: check with Dialect.getPreferredSqlTypeCodeForBoolean || jdbcType.isSmallInteger(); - case TEMPORAL: - return jdbcType.isTemporal(); - case DATE: - return jdbcType.hasDatePart(); - case TIME: - return jdbcType.hasTimePart(); - case SPATIAL: - return jdbcType.isSpatial(); - default: - // TODO: should we throw here? - return true; - } + case TEMPORAL -> jdbcType.isTemporal(); + case DATE -> jdbcType.hasDatePart(); + case TIME -> jdbcType.hasTimePart(); + case SPATIAL -> jdbcType.isSpatial(); + default -> true; // TODO: should we throw here? + }; } private static void throwError(