diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorDynamicMap.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorDynamicMap.java index b66760bf778c..ed3e1042c2ee 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorDynamicMap.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorDynamicMap.java @@ -4,7 +4,6 @@ */ package org.hibernate.metamodel.internal; -import java.util.Map; import java.util.function.Supplier; import org.hibernate.mapping.Component; @@ -30,7 +29,7 @@ public EmbeddableInstantiatorDynamicMap( @Override public Object instantiate(ValueAccess valuesAccess) { - final Map dataMap = generateDataMap(); + final var dataMap = generateDataMap(); final var values = valuesAccess == null ? null : valuesAccess.getValues(); if ( values != null ) { final var mappingType = runtimeDescriptorAccess.get(); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoIndirecting.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoIndirecting.java index 4b02422129a0..67efacb44cbb 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoIndirecting.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoIndirecting.java @@ -13,7 +13,9 @@ /** * Support for instantiating embeddables as POJO representation through a constructor */ -public class EmbeddableInstantiatorPojoIndirecting extends AbstractPojoInstantiator implements EmbeddableInstantiator { +public class EmbeddableInstantiatorPojoIndirecting + extends AbstractPojoInstantiator + implements EmbeddableInstantiator { protected final Constructor constructor; protected final int[] index; @@ -30,7 +32,7 @@ public static EmbeddableInstantiatorPojoIndirecting of( if ( componentNames == null ) { throw new IllegalArgumentException( "Can't determine field assignment for constructor: " + constructor ); } - final int[] index = new int[componentNames.length]; + final var index = new int[componentNames.length]; return EmbeddableHelper.resolveIndex( propertyNames, componentNames, index ) ? new EmbeddableInstantiatorPojoIndirectingWithGap( constructor, index ) : new EmbeddableInstantiatorPojoIndirecting( constructor, index ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoOptimized.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoOptimized.java index 40c72aeabeae..5e77b55c317e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoOptimized.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoOptimized.java @@ -15,7 +15,9 @@ * Support for instantiating embeddables as POJO representation * using bytecode optimizer */ -public class EmbeddableInstantiatorPojoOptimized extends AbstractPojoInstantiator implements StandardEmbeddableInstantiator { +public class EmbeddableInstantiatorPojoOptimized + extends AbstractPojoInstantiator + implements StandardEmbeddableInstantiator { private final Supplier embeddableMappingAccess; private final InstantiationOptimizer instantiationOptimizer; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoStandard.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoStandard.java index f6218d5565c8..d28556d9d9a8 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorPojoStandard.java @@ -18,12 +18,16 @@ /** * Support for instantiating embeddables as POJO representation */ -public class EmbeddableInstantiatorPojoStandard extends AbstractPojoInstantiator implements StandardEmbeddableInstantiator { +public class EmbeddableInstantiatorPojoStandard + extends AbstractPojoInstantiator + implements StandardEmbeddableInstantiator { private final Supplier embeddableMappingAccess; private final Constructor constructor; - public EmbeddableInstantiatorPojoStandard(Class embeddableClass, Supplier embeddableMappingAccess) { + public EmbeddableInstantiatorPojoStandard( + Class embeddableClass, + Supplier embeddableMappingAccess) { super( embeddableClass ); this.embeddableMappingAccess = embeddableMappingAccess; this.constructor = resolveConstructor( embeddableClass ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordIndirecting.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordIndirecting.java index aa323b43c8d5..9b51f59eb072 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordIndirecting.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableInstantiatorRecordIndirecting.java @@ -22,8 +22,8 @@ public EmbeddableInstantiatorRecordIndirecting(Class javaType, int[] index) { } public static EmbeddableInstantiatorRecordIndirecting of(Class javaType, String[] propertyNames) { - final String[] componentNames = getRecordComponentNames( javaType ); - final int[] index = new int[componentNames.length]; + final var componentNames = getRecordComponentNames( javaType ); + final var index = new int[componentNames.length]; return EmbeddableHelper.resolveIndex( propertyNames, componentNames, index ) ? new EmbeddableInstantiatorRecordIndirectingWithGap( javaType, index ) : new EmbeddableInstantiatorRecordIndirecting( javaType, index ); @@ -49,7 +49,8 @@ public Object instantiate(ValueAccess valuesAccess) { } // Handles gaps, by leaving the value null for that index - private static class EmbeddableInstantiatorRecordIndirectingWithGap extends EmbeddableInstantiatorRecordIndirecting { + private static class EmbeddableInstantiatorRecordIndirectingWithGap + extends EmbeddableInstantiatorRecordIndirecting { public EmbeddableInstantiatorRecordIndirectingWithGap(Class javaType, int[] index) { super( javaType, index ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyPojo.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyPojo.java index 9c345ec97b82..86b61966b486 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyPojo.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EmbeddableRepresentationStrategyPojo.java @@ -39,7 +39,6 @@ public class EmbeddableRepresentationStrategyPojo implements EmbeddableRepresent private final PropertyAccess[] propertyAccesses; private final Map attributeNameToPositionMap; - private final StrategySelector strategySelector; private final ReflectionOptimizer reflectionOptimizer; private final EmbeddableInstantiator instantiator; private final Map instantiatorsByDiscriminator; @@ -57,20 +56,23 @@ public EmbeddableRepresentationStrategyPojo( propertyAccesses = new PropertyAccess[propertySpan]; attributeNameToPositionMap = new HashMap<>( propertySpan ); + final var strategySelector = + creationContext.getServiceRegistry() + .getService( StrategySelector.class ); + // We need access to the Class objects, used only during initialization final var subclassesByName = getSubclassesByName( bootDescriptor, creationContext ); boolean foundCustomAccessor = false; for ( int i = 0; i < bootDescriptor.getProperties().size(); i++ ) { final var property = bootDescriptor.getProperty( i ); - final Class embeddableClass; - if ( subclassesByName != null ) { - final var subclass = subclassesByName.get( bootDescriptor.getPropertyDeclaringClass( property ) ); - embeddableClass = subclass != null ? subclass : getEmbeddableJavaType().getJavaTypeClass(); - } - else { - embeddableClass = getEmbeddableJavaType().getJavaTypeClass(); - } - propertyAccesses[i] = buildPropertyAccess( property, embeddableClass, customInstantiator == null ); + final var embeddableClass = getEmbeddableClass( bootDescriptor, subclassesByName, property ); + propertyAccesses[i] = + buildPropertyAccess( + property, + embeddableClass, + customInstantiator == null, + strategySelector + ); attributeNameToPositionMap.put( property.getName(), i ); if ( !property.isBasicPropertyAccessor() ) { @@ -78,11 +80,9 @@ public EmbeddableRepresentationStrategyPojo( } } - boolean hasCustomAccessors = foundCustomAccessor; - strategySelector = creationContext.getServiceRegistry().getService( StrategySelector.class ); reflectionOptimizer = buildReflectionOptimizer( bootDescriptor, - hasCustomAccessors, + foundCustomAccessor, propertyAccesses, creationContext ); @@ -120,6 +120,19 @@ public EmbeddableRepresentationStrategyPojo( } } + private Class getEmbeddableClass( + Component bootDescriptor, + Map> subclassesByName, + Property property) { + if ( subclassesByName != null ) { + final var subclass = subclassesByName.get( bootDescriptor.getPropertyDeclaringClass( property ) ); + return subclass != null ? subclass : getEmbeddableJavaType().getJavaTypeClass(); + } + else { + return getEmbeddableJavaType().getJavaTypeClass(); + } + } + private static JavaType resolveEmbeddableJavaType( Component bootDescriptor, CompositeUserType compositeUserType, @@ -165,7 +178,8 @@ private static ProxyFactoryFactory getProxyFactoryFactory(RuntimeModelCreationCo private PropertyAccess buildPropertyAccess( Property property, Class embeddableClass, - boolean requireSetters) { + boolean requireSetters, + StrategySelector strategySelector) { final var strategy = propertyAccessStrategy( property, embeddableClass, strategySelector ); if ( strategy == null ) { throw new HibernateException( diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java index ccd81ab420df..d452dbbd0bf0 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/EntityRepresentationStrategyPojoStandard.java @@ -52,8 +52,6 @@ public class EntityRepresentationStrategyPojoStandard implements EntityRepresent private final ProxyFactory proxyFactory; private final EntityInstantiator instantiator; - private final StrategySelector strategySelector; - private final String identifierPropertyName; private final PropertyAccess identifierPropertyAccess; private final Map propertyAccessMap; @@ -73,17 +71,23 @@ public EntityRepresentationStrategyPojoStandard( isBytecodeEnhanced = isPersistentAttributeInterceptableType( mappedJavaType ); + final var strategySelector = + creationContext.getServiceRegistry() + .getService( StrategySelector.class ); + final var identifierProperty = bootDescriptor.getIdentifierProperty(); if ( identifierProperty == null ) { identifierPropertyName = null; identifierPropertyAccess = null; if ( bootDescriptor.getIdentifier() instanceof Component descriptorIdentifierComponent ) { - final Component identifierMapper = bootDescriptor.getIdentifierMapper(); + final var identifierMapper = bootDescriptor.getIdentifierMapper(); mapsIdRepresentationStrategy = new EmbeddableRepresentationStrategyPojo( identifierMapper == null ? descriptorIdentifierComponent : identifierMapper, () -> { - final var type = (CompositeTypeImplementor) bootDescriptor.getIdentifierMapper().getType(); + final var type = + (CompositeTypeImplementor) + bootDescriptor.getIdentifierMapper().getType(); return type.getMappingModelPart().getEmbeddableTypeDescriptor(); }, // we currently do not support custom instantiators for identifiers @@ -99,11 +103,9 @@ public EntityRepresentationStrategyPojoStandard( else { mapsIdRepresentationStrategy = null; identifierPropertyName = identifierProperty.getName(); - identifierPropertyAccess = makePropertyAccess( identifierProperty ); + identifierPropertyAccess = makePropertyAccess( identifierProperty, strategySelector ); } - strategySelector = creationContext.getServiceRegistry().getService( StrategySelector.class ); - final var bytecodeProvider = creationContext.getBootstrapContext().getServiceRegistry() .requireService( BytecodeProvider.class ); @@ -116,7 +118,7 @@ public EntityRepresentationStrategyPojoStandard( creationContext ); - propertyAccessMap = buildPropertyAccessMap( bootDescriptor ); + propertyAccessMap = buildPropertyAccessMap( bootDescriptor, strategySelector ); reflectionOptimizer = resolveReflectionOptimizer( bytecodeProvider ); instantiator = determineInstantiator( bootDescriptor, runtimeDescriptor ); @@ -129,7 +131,8 @@ private ProxyFactory resolveProxyFactory( BytecodeProvider bytecodeProvider, RuntimeModelCreationContext creationContext) { if ( entityPersister.isAbstract() && bootDescriptor.isConcreteProxy() ) { - // The entity class is abstract, but the hierarchy always gets entities loaded/proxied using their concrete type. + // The entity class is abstract, but the hierarchy always + // gets entities loaded/proxied using their concrete type. // So we do not need proxies for this entity class. return null; } @@ -143,9 +146,10 @@ else if ( entityPersister.getBytecodeEnhancementMetadata().isEnhancedForLazyLoad } else { if ( proxyJavaType != null && entityPersister.isLazy() ) { - final var proxyFactory = createProxyFactory( bootDescriptor, bytecodeProvider, creationContext ); + final var proxyFactory = + createProxyFactory( bootDescriptor, bytecodeProvider, creationContext ); if ( proxyFactory == null ) { - ((EntityMetamodel) entityPersister).setLazy( false ); + ( (EntityMetamodel) entityPersister ).setLazy( false ); } return proxyFactory; } @@ -155,10 +159,11 @@ else if ( entityPersister.getBytecodeEnhancementMetadata().isEnhancedForLazyLoad } } - private Map buildPropertyAccessMap(PersistentClass bootDescriptor) { + private Map buildPropertyAccessMap( + PersistentClass bootDescriptor, StrategySelector strategySelector) { final Map propertyAccessMap = new LinkedHashMap<>(); for ( var property : bootDescriptor.getAllPropertyClosure() ) { - propertyAccessMap.put( property.getName(), makePropertyAccess( property ) ); + propertyAccessMap.put( property.getName(), makePropertyAccess( property, strategySelector ) ); } return propertyAccessMap; } @@ -309,7 +314,7 @@ private ReflectionOptimizer resolveReflectionOptimizer(BytecodeProvider bytecode return bytecodeProvider.getReflectionOptimizer( mappedJtd.getJavaTypeClass(), propertyAccessMap ); } - private PropertyAccess makePropertyAccess(Property bootAttributeDescriptor) { + private PropertyAccess makePropertyAccess(Property bootAttributeDescriptor, StrategySelector strategySelector) { final var mappedClass = mappedJtd.getJavaTypeClass(); final String descriptorName = bootAttributeDescriptor.getName(); final var strategy = propertyAccessStrategy( bootAttributeDescriptor, mappedClass, strategySelector ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDiscriminatorMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDiscriminatorMapping.java index 451b1f45099f..ee3b840217c9 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDiscriminatorMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDiscriminatorMapping.java @@ -168,7 +168,6 @@ public BasicFetch generateFetch( discriminatorType.getValueConverter(), fetchTiming, true, - creationState, false, !sqlSelection.isVirtual() ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDomainPath.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDomainPath.java index be1ce030c509..0a6cc88cdfd4 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDomainPath.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDomainPath.java @@ -14,7 +14,6 @@ import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.metamodel.mapping.ordering.ast.DomainPath; -import org.hibernate.metamodel.mapping.ordering.ast.OrderingExpression; import org.hibernate.query.SortDirection; import org.hibernate.sql.ast.spi.SqlAstCreationState; import org.hibernate.sql.ast.tree.SqlAstNode; @@ -28,6 +27,7 @@ import org.hibernate.sql.results.internal.SqlSelectionImpl; import static org.hibernate.internal.util.NullnessUtil.castNonNull; +import static org.hibernate.metamodel.mapping.ordering.ast.OrderingExpression.applyCollation; import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createColumnReferenceKey; /** @@ -209,9 +209,11 @@ private void addSortSpecification( ); } else { - final var subPart = embeddableValuedModelPart.findSubPart( modelPartName, null ); + final var subPart = + embeddableValuedModelPart.findSubPart( modelPartName, null ) + .asBasicValuedModelPart(); addSortSpecification( - castNonNull( subPart.asBasicValuedModelPart() ), + castNonNull( subPart ), ast, tableGroup, collation, @@ -260,8 +262,7 @@ && selectClauseDoesNotContainOrderExpression( expression, selectClause ) ) { selectClause.addSqlSelection( new SqlSelectionImpl( valuesArrayPosition, expression ) ); } - final var sortExpression = - OrderingExpression.applyCollation( expression, collation, creationState ); + final var sortExpression = applyCollation( expression, collation, creationState ); ast.addSortSpecification( new SortSpecification( sortExpression, sortOrder, nullPrecedence ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEmbeddableMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEmbeddableMapping.java index 79a61fe5037d..6f40411c1277 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEmbeddableMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEmbeddableMapping.java @@ -58,6 +58,8 @@ import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.MutabilityPlan; +import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.buildBasicAttributeMapping; + /** * Base support for EmbeddableMappingType implementations */ @@ -351,7 +353,7 @@ protected boolean finishInitialization( selectablePath = new SelectablePath( determineEmbeddablePrefix() + bootPropertyDescriptor.getName() ); } - attributeMapping = MappingModelCreationHelper.buildBasicAttributeMapping( + attributeMapping = buildBasicAttributeMapping( bootPropertyDescriptor.getName(), role, attributeIndex, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEntityCollectionPart.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEntityCollectionPart.java index e7418e75dd38..954e4f4a4ce0 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEntityCollectionPart.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEntityCollectionPart.java @@ -24,7 +24,6 @@ import org.hibernate.metamodel.model.domain.NavigableRole; import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.spi.NavigablePath; -import org.hibernate.sql.ast.spi.FromClauseAccess; import org.hibernate.sql.ast.spi.SqlAliasBase; import org.hibernate.sql.ast.spi.SqlAstCreationState; import org.hibernate.sql.ast.tree.from.PluralTableGroup; @@ -42,6 +41,8 @@ import org.hibernate.type.Type; import static org.hibernate.internal.util.StringHelper.isEmpty; +import static org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.addPrefixedPropertyNames; +import static org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.addPrefixedPropertyPaths; import static org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping.findMapsIdPropertyName; /** @@ -188,18 +189,15 @@ public DomainResult createDomainResult( TableGroup tableGroup, String resultVariable, DomainResultCreationState creationState) { - final TableGroup partTableGroup = resolveTableGroup( navigablePath, creationState ); + final var partTableGroup = resolveTableGroup( navigablePath, creationState ); return associatedEntityTypeDescriptor.createDomainResult( navigablePath, partTableGroup, resultVariable, creationState ); } @Override public Object disassemble(Object value, SharedSessionContractImplementor session) { - if ( value == null ) { - return null; - } - - // should be an instance of the associated entity - return getAssociatedEntityMappingType().getIdentifierMapping().getIdentifier( value ); + return value == null ? null + // should be an instance of the associated entity + : getAssociatedEntityMappingType().getIdentifierMapping().getIdentifier( value ); } @@ -214,11 +212,10 @@ public EntityFetch generateFetch( final var associationKey = resolveFetchAssociationKey(); final boolean added = creationState.registerVisitedAssociationKey( associationKey ); - final var partTableGroup = resolveTableGroup( fetchablePath, creationState ); final var fetch = buildEntityFetchJoined( fetchParent, this, - partTableGroup, + resolveTableGroup( fetchablePath, creationState ), fetchablePath, creationState ); @@ -271,25 +268,18 @@ protected EntityFetch buildEntityFetchJoined( private TableGroup resolveTableGroup(NavigablePath fetchablePath, DomainResultCreationState creationState) { final var fromClauseAccess = creationState.getSqlAstCreationState().getFromClauseAccess(); - return fromClauseAccess.resolveTableGroup( fetchablePath, (np) -> { - final var parentTableGroup = (PluralTableGroup) fromClauseAccess.getTableGroup( np.getParent() ); + return fromClauseAccess.resolveTableGroup( fetchablePath, navigablePath -> { + final var parentTableGroup = + (PluralTableGroup) + fromClauseAccess.getTableGroup( navigablePath.getParent() ); return switch ( nature ) { case ELEMENT -> parentTableGroup.getElementTableGroup(); - case INDEX -> resolveIndexTableGroup( parentTableGroup, fetchablePath, fromClauseAccess, creationState ); - default -> throw new IllegalStateException( "Could not find table group for: " + np ); + case INDEX -> parentTableGroup.getIndexTableGroup(); + default -> throw new IllegalStateException( "Could not find table group for: " + navigablePath ); }; - } ); } - private TableGroup resolveIndexTableGroup( - PluralTableGroup collectionTableGroup, - NavigablePath fetchablePath, - FromClauseAccess fromClauseAccess, - DomainResultCreationState creationState) { - return collectionTableGroup.getIndexTableGroup(); - } - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // TableGroupProducer @@ -316,7 +306,7 @@ public TableGroup createTableGroupInternal( getEntityMappingType() .createPrimaryTableReference( sqlAliasBase, creationState ); - final TableGroup tableGroup = new StandardTableGroup( + final var tableGroup = new StandardTableGroup( canUseInnerJoins, navigablePath, this, @@ -383,13 +373,13 @@ else if ( bootModelValue instanceof ToOne toOne ) { if ( propertyType instanceof ComponentType compositeType && compositeType.isEmbedded() && compositeType.getPropertyNames().length == 1 ) { - ToOneAttributeMapping.addPrefixedPropertyPaths( + addPrefixedPropertyPaths( targetKeyPropertyNames, compositeType.getPropertyNames()[0], compositeType.getSubtypes()[0], creationProcess.getCreationContext().getSessionFactory() ); - ToOneAttributeMapping.addPrefixedPropertyNames( + addPrefixedPropertyNames( targetKeyPropertyNames, EntityIdentifierMapping.ID_ROLE_NAME, propertyType, @@ -397,7 +387,7 @@ else if ( bootModelValue instanceof ToOne toOne ) { ); } else { - ToOneAttributeMapping.addPrefixedPropertyPaths( + addPrefixedPropertyPaths( targetKeyPropertyNames, null, propertyType, @@ -406,7 +396,7 @@ else if ( bootModelValue instanceof ToOne toOne ) { } } else { - ToOneAttributeMapping.addPrefixedPropertyPaths( + addPrefixedPropertyPaths( targetKeyPropertyNames, entityBinding.getIdentifierProperty().getName(), propertyType, @@ -422,7 +412,7 @@ else if ( bootModelValue instanceof OneToMany ) { targetKeyPropertyNames.add( referencedPropertyName.substring( 0, dotIndex ) ); } // todo (PropertyMapping) : the problem here is timing. this needs to be delayed. - ToOneAttributeMapping.addPrefixedPropertyPaths( + addPrefixedPropertyPaths( targetKeyPropertyNames, referencedPropertyName, elementTypeDescriptor.getEntityPersister().getPropertyType( referencedPropertyName ), @@ -436,13 +426,13 @@ else if ( bootModelValue instanceof OneToMany ) { && compositeType.isEmbedded() && compositeType.getPropertyNames().length == 1 ) { final Set targetKeyPropertyNames = new HashSet<>( 2 ); - ToOneAttributeMapping.addPrefixedPropertyPaths( + addPrefixedPropertyPaths( targetKeyPropertyNames, compositeType.getPropertyNames()[0], compositeType.getSubtypes()[0], creationProcess.getCreationContext().getSessionFactory() ); - ToOneAttributeMapping.addPrefixedPropertyNames( + addPrefixedPropertyNames( targetKeyPropertyNames, EntityIdentifierMapping.ID_ROLE_NAME, propertyType, @@ -457,7 +447,7 @@ else if ( bootModelValue instanceof OneToMany ) { final String mapsIdAttributeName = findMapsIdPropertyName( elementTypeDescriptor, referencedPropertyName ); if ( mapsIdAttributeName != null ) { - ToOneAttributeMapping.addPrefixedPropertyPaths( + addPrefixedPropertyPaths( targetKeyPropertyNames, mapsIdAttributeName, elementTypeDescriptor.getEntityPersister().getIdentifierType(), @@ -465,7 +455,7 @@ else if ( bootModelValue instanceof OneToMany ) { ); } else { - ToOneAttributeMapping.addPrefixedPropertyPaths( + addPrefixedPropertyPaths( targetKeyPropertyNames, null, propertyType, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractNaturalIdMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractNaturalIdMapping.java index bc048fff29c3..307519db477c 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractNaturalIdMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractNaturalIdMapping.java @@ -24,9 +24,7 @@ public AbstractNaturalIdMapping( boolean mutable) { this.declaringType = declaringType; this.mutable = mutable; - this.cachesAccess = declaringType.getEntityPersister().getNaturalIdCacheAccessStrategy(); - this.role = declaringType.getNavigableRole().append( PART_NAME ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyDiscriminatorPart.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyDiscriminatorPart.java index 15199d208562..a4c6be569e77 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyDiscriminatorPart.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyDiscriminatorPart.java @@ -399,7 +399,6 @@ public BasicFetch generateFetch( fetchablePath, this, fetchTiming, - creationState, !sqlSelection.isVirtual() ); } @@ -437,11 +436,9 @@ public Expression resolveSqlExpression( JdbcMapping jdbcMappingToUse, TableGroup tableGroup, SqlAstCreationState creationState) { - var tableReference = tableGroup.resolveTableReference( - navigablePath, - this, - getContainingTableExpression() - ); + final var tableReference = + tableGroup.resolveTableReference( navigablePath, this, + getContainingTableExpression() ); return creationState.getSqlExpressionResolver() .resolveSqlExpression( tableReference, this ); } @@ -472,7 +469,7 @@ private SqlSelection resolveSqlSelection( resolveSqlExpression( navigablePath, null, tableGroup, sqlAstCreationState ), jdbcMapping().getJdbcJavaType(), null, - creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() + sqlAstCreationState.getCreationContext().getTypeConfiguration() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyKeyPart.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyKeyPart.java index c5b473ef1665..521db9b6737e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyKeyPart.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyKeyPart.java @@ -270,23 +270,20 @@ public Fetch generateFetch( String resultVariable, DomainResultCreationState creationState) { final var sqlAstCreationState = creationState.getSqlAstCreationState(); - final var fromClauseAccess = sqlAstCreationState.getFromClauseAccess(); final var sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); - final var tableGroup = fromClauseAccess.getTableGroup( fetchParent.getNavigablePath().getParent() ); - final var tableReference = tableGroup.resolveTableReference( fetchablePath, table ); + final var tableReference = + sqlAstCreationState.getFromClauseAccess() + .getTableGroup( fetchParent.getNavigablePath().getParent() ) + .resolveTableReference( fetchablePath, table ); - final var columnReference = sqlExpressionResolver.resolveSqlExpression( - tableReference, - this - ); - - final var sqlSelection = sqlExpressionResolver.resolveSqlSelection( - columnReference, - jdbcMapping.getJdbcJavaType(), - fetchParent, - sqlAstCreationState.getCreationContext().getTypeConfiguration() - ); + final var sqlSelection = + sqlExpressionResolver.resolveSqlSelection( + sqlExpressionResolver.resolveSqlExpression( tableReference, this ), + jdbcMapping.getJdbcJavaType(), + fetchParent, + sqlAstCreationState.getCreationContext().getTypeConfiguration() + ); return new BasicFetch<>( sqlSelection.getValuesArrayPosition(), @@ -294,7 +291,6 @@ public Fetch generateFetch( fetchablePath, this, fetchTiming, - creationState, !sqlSelection.isVirtual() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicAttributeMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicAttributeMapping.java index de0e545e9543..5b12b2173a33 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicAttributeMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicAttributeMapping.java @@ -165,9 +165,10 @@ public BasicAttributeMapping( this.tableExpression = tableExpression; this.mappedColumnExpression = mappedColumnExpression; this.temporalPrecision = temporalPrecision; - this.selectablePath = selectablePath == null - ? new SelectablePath( mappedColumnExpression ) - : selectablePath; + this.selectablePath = + selectablePath == null + ? new SelectablePath( mappedColumnExpression ) + : selectablePath; this.isFormula = isFormula; this.columnDefinition = columnDefinition; this.length = length; @@ -181,16 +182,10 @@ public BasicAttributeMapping( this.partitioned = partitioned; this.jdbcMapping = jdbcMapping; this.domainTypeDescriptor = jdbcMapping.getJavaTypeDescriptor(); - this.customReadExpression = customReadExpression; - - if ( isFormula ) { - this.customWriteExpression = null; - } - else { - this.customWriteExpression = customWriteExpression; - } - this.isLazy = navigableRole.getParent().getParent() == null + this.customWriteExpression = isFormula ? null : customWriteExpression; + this.isLazy = + navigableRole.getParent().getParent() == null && declaringType.findContainingEntityMapping() .getEntityPersister() .getBytecodeEnhancementMetadata() @@ -380,7 +375,8 @@ public NavigableRole getNavigableRole() { @Override public String toString() { - return "BasicAttributeMapping(" + navigableRole + ")@" + System.identityHashCode( this ); + return "BasicAttributeMapping(" + navigableRole + ")@" + + System.identityHashCode( this ); } @Override @@ -389,10 +385,9 @@ public DomainResult createDomainResult( TableGroup tableGroup, String resultVariable, DomainResultCreationState creationState) { - final SqlSelection sqlSelection = resolveSqlSelection( navigablePath, tableGroup, null, creationState ); - - //noinspection unchecked - return new BasicResult( + final var sqlSelection = + resolveSqlSelection( navigablePath, tableGroup, null, creationState ); + return new BasicResult<>( sqlSelection.getValuesArrayPosition(), resultVariable, jdbcMapping, @@ -409,12 +404,9 @@ private SqlSelection resolveSqlSelection( DomainResultCreationState creationState) { final var sqlAstCreationState = creationState.getSqlAstCreationState(); final var expressionResolver = sqlAstCreationState.getSqlExpressionResolver(); - final var tableReference = tableGroup.resolveTableReference( - navigablePath, - this, - getContainingTableExpression() - ); - + final var tableReference = + tableGroup.resolveTableReference( navigablePath, this, + getContainingTableExpression() ); return expressionResolver.resolveSqlSelection( expressionResolver.resolveSqlExpression( tableReference, this ), jdbcMapping.getJdbcJavaType(), @@ -486,7 +478,6 @@ public Fetch generateFetch( getJdbcMapping().getValueConverter(), fetchTiming, true, - creationState, coerceResultType, sqlSelection != null && !sqlSelection.isVirtual() ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicEntityIdentifierMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicEntityIdentifierMappingImpl.java index 6b28e756d836..c2f338be8f66 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicEntityIdentifierMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicEntityIdentifierMappingImpl.java @@ -21,14 +21,13 @@ import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.JdbcMapping; +import org.hibernate.metamodel.mapping.JdbcMappingContainer; import org.hibernate.metamodel.mapping.MappingType; import org.hibernate.metamodel.model.domain.NavigableRole; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.property.access.spi.PropertyAccess; -import org.hibernate.proxy.HibernateProxy; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.spi.SqlSelection; -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.results.graph.DomainResult; @@ -41,6 +40,8 @@ import org.hibernate.type.BasicType; import org.hibernate.type.descriptor.java.JavaType; +import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer; + /** * Mapping of a simple identifier * @@ -180,7 +181,7 @@ public IdentifierValue getUnsavedStrategy() { @Override public Object getIdentifier(Object entity) { - final var lazyInitializer = HibernateProxy.extractLazyInitializer( entity ); + final var lazyInitializer = extractLazyInitializer( entity ); if ( lazyInitializer != null ) { return lazyInitializer.getInternalIdentifier(); } @@ -246,7 +247,8 @@ public DomainResult createDomainResult( TableGroup tableGroup, String resultVariable, DomainResultCreationState creationState) { - final var sqlSelection = resolveSqlSelection( navigablePath, tableGroup, null, creationState ); + final var sqlSelection = + resolveSqlSelection( navigablePath, tableGroup, null, creationState ); return new BasicResult<>( sqlSelection.getValuesArrayPosition(), resultVariable, @@ -283,9 +285,18 @@ private SqlSelection resolveSqlSelection( FetchParent fetchParent, DomainResultCreationState creationState) { final var expressionResolver = creationState.getSqlAstCreationState().getSqlExpressionResolver(); - final TableReference rootTableReference; + final var rootTableReference = rootTableReference( navigablePath, tableGroup ); + return expressionResolver.resolveSqlSelection( + expressionResolver.resolveSqlExpression( rootTableReference, this ), + idType.getJdbcJavaType(), + fetchParent, + sessionFactory.getTypeConfiguration() + ); + } + + private TableReference rootTableReference(NavigablePath navigablePath, TableGroup tableGroup) { try { - rootTableReference = tableGroup.resolveTableReference( navigablePath, rootTable ); + return tableGroup.resolveTableReference( navigablePath, rootTable ); } catch (Exception e) { throw new IllegalStateException( @@ -299,18 +310,6 @@ private SqlSelection resolveSqlSelection( e ); } - - final Expression expression = expressionResolver.resolveSqlExpression( - rootTableReference, - this - ); - - return expressionResolver.resolveSqlSelection( - expression, - idType.getJdbcJavaType(), - fetchParent, - sessionFactory.getTypeConfiguration() - ); } @Override @@ -437,14 +436,14 @@ public Fetch generateFetch( boolean selected, String resultVariable, DomainResultCreationState creationState) { - final var sqlAstCreationState = creationState.getSqlAstCreationState(); final var tableGroup = - sqlAstCreationState.getFromClauseAccess() + creationState.getSqlAstCreationState() + .getFromClauseAccess() .getTableGroup( fetchParent.getNavigablePath() ); assert tableGroup != null; - final var sqlSelection = resolveSqlSelection( fetchablePath, tableGroup, fetchParent, creationState ); - final var selectionType = sqlSelection.getExpressionType(); + final var sqlSelection = + resolveSqlSelection( fetchablePath, tableGroup, fetchParent, creationState ); return new BasicFetch<>( sqlSelection.getValuesArrayPosition(), fetchParent, @@ -453,14 +452,18 @@ public Fetch generateFetch( getJdbcMapping().getValueConverter(), FetchTiming.IMMEDIATE, true, - creationState, // if the expression type is different that the expected type coerce the value - selectionType != null - && selectionType.getSingleJdbcMapping().getJdbcJavaType() != getJdbcMapping().getJdbcJavaType(), + mustCoerceResultType( sqlSelection.getExpressionType() ), !sqlSelection.isVirtual() ); } + private boolean mustCoerceResultType(JdbcMappingContainer selectionType) { + return selectionType != null + && selectionType.getSingleJdbcMapping().getJdbcJavaType() + != getJdbcMapping().getJdbcJavaType(); + } + @Override public FetchStyle getStyle() { return FetchStyle.JOIN; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicValuedCollectionPart.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicValuedCollectionPart.java index ace237b91190..96bcc1682a86 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicValuedCollectionPart.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicValuedCollectionPart.java @@ -26,7 +26,6 @@ import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.tree.from.PluralTableGroup; import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.results.ResultsLogger; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.Fetch; @@ -36,6 +35,8 @@ import org.hibernate.sql.results.graph.basic.BasicResult; import org.hibernate.type.descriptor.java.JavaType; +import static org.hibernate.sql.results.ResultsLogger.RESULTS_LOGGER; + /** * Models a basic collection element/value or index/key * @@ -261,8 +262,8 @@ public Fetch generateFetch( boolean selected, String resultVariable, DomainResultCreationState creationState) { - if ( ResultsLogger.RESULTS_LOGGER.isTraceEnabled() ) { - ResultsLogger.RESULTS_LOGGER.tracef( + if ( RESULTS_LOGGER.isTraceEnabled() ) { + RESULTS_LOGGER.tracef( "Generating Fetch for collection-part: `%s` -> `%s`", collectionDescriptor.getRole(), nature.getName() @@ -285,7 +286,6 @@ public Fetch generateFetch( fetchablePath, this, FetchTiming.IMMEDIATE, - creationState, !sqlSelection.isVirtual() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CaseStatementDiscriminatorMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CaseStatementDiscriminatorMappingImpl.java index a4ca7680880b..3831a11093b8 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CaseStatementDiscriminatorMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CaseStatementDiscriminatorMappingImpl.java @@ -28,7 +28,6 @@ import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.ast.tree.from.TableReference; import org.hibernate.sql.ast.tree.predicate.NullnessPredicate; -import org.hibernate.sql.ast.tree.predicate.Predicate; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.FetchParent; @@ -62,14 +61,13 @@ public CaseStatementDiscriminatorMappingImpl( final String tableName = tableNames[notNullColumnTableNumbers[i]]; final String oneSubEntityColumn = notNullColumnNames[i]; final String discriminatorValue = discriminatorValues[i]; - tableDiscriminatorDetailsMap.put( - tableName, + tableDiscriminatorDetailsMap.put( tableName, new TableDiscriminatorDetails( tableName, oneSubEntityColumn, - getUnderlyingJdbcMapping().getJavaTypeDescriptor().wrap( discriminatorValue, null ) - ) - ); + getUnderlyingJdbcMapping().getJavaTypeDescriptor() + .wrap( discriminatorValue, null ) + ) ); } } } @@ -125,15 +123,15 @@ public Expression resolveSqlExpression( JdbcMapping jdbcMappingToUse, TableGroup tableGroup, SqlAstCreationState creationState) { - final var expressionResolver = creationState.getSqlExpressionResolver(); - return expressionResolver.resolveSqlExpression( - createColumnReferenceKey( - tableGroup.getPrimaryTableReference(), - getSelectionExpression(), - jdbcMappingToUse - ), - sqlAstProcessingState -> createCaseSearchedExpression( tableGroup ) - ); + return creationState.getSqlExpressionResolver() + .resolveSqlExpression( + createColumnReferenceKey( + tableGroup.getPrimaryTableReference(), + getSelectionExpression(), + jdbcMappingToUse + ), + sqlAstProcessingState -> createCaseSearchedExpression( tableGroup ) + ); } private Expression createCaseSearchedExpression(TableGroup entityTableGroup) { @@ -263,7 +261,8 @@ public CaseStatementDiscriminatorExpression(TableGroup entityTableGroup) { } public List getUsedTableReferences() { - final ArrayList usedTableReferences = new ArrayList<>( tableDiscriminatorDetailsMap.size() ); + final ArrayList usedTableReferences = + new ArrayList<>( tableDiscriminatorDetailsMap.size() ); tableDiscriminatorDetailsMap.forEach( (tableName, tableDiscriminatorDetails) -> { final var tableReference = entityTableGroup.getTableReference( @@ -287,7 +286,8 @@ public void renderToSql( SessionFactoryImplementor sessionFactory) { if ( caseSearchedExpression == null ) { // todo (6.0): possible optimization is to omit cases for table reference joins, that touch a super class, where a subclass is inner joined due to pruning - caseSearchedExpression = new CaseSearchedExpression( CaseStatementDiscriminatorMappingImpl.this ); + caseSearchedExpression = + new CaseSearchedExpression( CaseStatementDiscriminatorMappingImpl.this ); tableDiscriminatorDetailsMap.forEach( (tableName, tableDiscriminatorDetails) -> { final var tableReference = entityTableGroup.getTableReference( @@ -296,29 +296,26 @@ public void renderToSql( false ); - if ( tableReference == null ) { - // assume this is because it is a table that is not part of the processing entity's sub-hierarchy - return; + if ( tableReference != null ) { + caseSearchedExpression.when( + new NullnessPredicate( + new ColumnReference( + tableReference, + tableDiscriminatorDetails.getCheckColumnName(), + false, + null, + getJdbcMapping() + ), + true + ), + new QueryLiteral<>( + tableDiscriminatorDetails.getDiscriminatorValue(), + getUnderlyingJdbcMapping() + ) + ); } - - final Predicate predicate = new NullnessPredicate( - new ColumnReference( - tableReference, - tableDiscriminatorDetails.getCheckColumnName(), - false, - null, - getJdbcMapping() - ), - true - ); - - caseSearchedExpression.when( - predicate, - new QueryLiteral<>( - tableDiscriminatorDetails.getDiscriminatorValue(), - getUnderlyingJdbcMapping() - ) - ); + // else assume this is because it is a table that is + // not part of the processing entity's sub-hierarchy } ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CollectionIdentifierDescriptorImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CollectionIdentifierDescriptorImpl.java index 9bb5843f01d9..de41785a65d1 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CollectionIdentifierDescriptorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CollectionIdentifierDescriptorImpl.java @@ -47,7 +47,9 @@ public CollectionIdentifierDescriptorImpl( String containingTableName, String columnName, BasicType type) { - this.navigableRole = collectionDescriptor.getNavigableRole().append( Nature.ID.getName() ); + this.navigableRole = + collectionDescriptor.getNavigableRole() + .append( Nature.ID.getName() ); this.collectionDescriptor = collectionDescriptor; this.containingTableName = containingTableName; this.columnName = columnName; @@ -274,7 +276,6 @@ public Fetch generateFetch( fetchablePath, this, FetchTiming.IMMEDIATE, - creationState, !sqlSelection.isVirtual() ); } @@ -284,7 +285,6 @@ public DomainResult createDomainResult( TableGroup tableGroup, DomainResultCreationState creationState) { final var astCreationState = creationState.getSqlAstCreationState(); - final var astCreationContext = astCreationState.getCreationContext(); final var sqlExpressionResolver = astCreationState.getSqlExpressionResolver(); final var sqlSelection = sqlExpressionResolver.resolveSqlSelection( @@ -294,7 +294,8 @@ public DomainResult createDomainResult( ), type.getJdbcJavaType(), null, - astCreationContext.getTypeConfiguration() + astCreationState.getCreationContext() + .getTypeConfiguration() ); return new BasicResult<>( diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java index 0bcd550b280b..6ac03693314d 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java @@ -47,9 +47,7 @@ import org.hibernate.sql.results.jdbc.spi.RowProcessingState; import org.hibernate.type.descriptor.java.JavaType; -import java.beans.Introspector; import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.lang.reflect.RecordComponent; import java.util.ArrayList; import java.util.HashMap; @@ -59,6 +57,10 @@ import java.util.function.Consumer; import java.util.function.Function; +import static java.beans.Introspector.decapitalize; +import static java.lang.reflect.Modifier.isStatic; +import static java.util.Collections.emptyMap; + /** * Multi-attribute NaturalIdMapping implementation */ @@ -97,11 +99,9 @@ public CompoundNaturalIdMapping( "Determine compound natural-id JDBC mappings ( " + declaringType.getEntityName() + ")", () -> { final List jdbcMappings = new ArrayList<>(); - attributes.forEach( - (attribute) -> attribute.forEachJdbcType( - (index, jdbcMapping) -> jdbcMappings.add( jdbcMapping ) - ) - ); + attributes.forEach( attribute -> attribute.forEachJdbcType( + (index, jdbcMapping) -> jdbcMappings.add( jdbcMapping ) + ) ); this.jdbcMappings = jdbcMappings; return true; } @@ -224,8 +224,7 @@ public void verifyFlushState(Object id, Object[] currentState, Object[] loadedSt for ( int i = 0; i < getNaturalIdAttributes().size(); i++ ) { final var attributeMapping = getNaturalIdAttributes().get( i ); - final boolean updatable = attributeMapping.getAttributeMetadata().isUpdatable(); - if ( !updatable ) { + if ( !attributeMapping.getAttributeMetadata().isUpdatable() ) { final Object currentValue = naturalId[i]; final Object previousValue = previousNaturalId[i]; if ( !attributeMapping.areEqual( currentValue, previousValue, session ) ) { @@ -665,7 +664,7 @@ public Object[] assemble(RowProcessingState rowProcessingState) { @Override public void resolveState(RowProcessingState rowProcessingState) { - for ( DomainResultAssembler subAssembler : subAssemblers ) { + for ( var subAssembler : subAssemblers ) { subAssembler.resolveState( rowProcessingState ); } } @@ -702,19 +701,18 @@ private static ValueNormalizer createValueNormalizer( return new ValueNormalizerSupport( keyAttributes ); } - final ModelsContext modelsContext = creationProcess - .getCreationContext() - .getBootstrapContext() - .getModelsContext(); + final var modelsContext = + creationProcess.getCreationContext().getBootstrapContext() + .getModelsContext(); var naturalIdClass = naturalIdClassDetails.toJavaClass( modelsContext.getClassLoading(), modelsContext ); var naturalIdClassComponents = extractComponents( naturalIdClass ); var naturalIdClassGetterAccess = createNaturalIdClassGetterAccess( naturalIdClass ); final List> attributeMappers = new ArrayList<>(); - keyAttributes.forEach( (keyAttribute) -> { + keyAttributes.forEach( keyAttribute -> { // find the matching MemberDetails on the `naturalIdClass`... - final Getter extractor = resolveMatchingExtractor( + final var extractor = resolveMatchingExtractor( naturalIdClass, keyAttribute, naturalIdClassGetterAccess, @@ -725,13 +723,10 @@ private static ValueNormalizer createValueNormalizer( // between BasicAttributeMapperImpl and ToOneAttributeMapperImpl. // ideally we'd eventually support usage of the associated key entity's // id and then there would. see the note in ToOneAttributeMapperImpl#extractFrom - final AttributeMapper attrMapper; - if ( keyAttribute instanceof ToOneAttributeMapping ) { - attrMapper = new ToOneAttributeMapperImpl<>( keyAttribute, extractor ); - } - else { - attrMapper = new BasicAttributeMapperImpl<>( keyAttribute, extractor ); - } + final var attrMapper = + keyAttribute instanceof ToOneAttributeMapping + ? new ToOneAttributeMapperImpl( keyAttribute, extractor ) + : new BasicAttributeMapperImpl( keyAttribute, extractor ); attributeMappers.add( attrMapper ); } ); @@ -800,7 +795,7 @@ public Object[] normalize(Object value) { } public Object[] doNormalize(T idClassValue) { - final Object[] result = new Object[idClassAttributeMappers.size()]; + final var result = new Object[idClassAttributeMappers.size()]; for ( int i = 0; i < idClassAttributeMappers.size(); i++ ) { var value = idClassAttributeMappers.get( i ).extractFrom( idClassValue ); result[i] = value; @@ -833,70 +828,58 @@ private static Getter resolveMatchingExtractor( Map naturalIdClassComponents, ModelsContext modelsContext) { // first, if the `naturalIdClass` is a record, look for a component + final String keyName = keyAttribute.getAttributeName(); + if ( naturalIdClass.isRecord() ) { - var component = naturalIdClassComponents.get( keyAttribute.getAttributeName() ); + final var component = naturalIdClassComponents.get( keyName ); if ( component != null ) { - return new GetterMethodImpl( - naturalIdClass, - keyAttribute.getAttributeName(), - component.getAccessor() - ); + return new GetterMethodImpl( naturalIdClass, keyName, component.getAccessor() ); } } // next look for a getter method - var getterMethod = getterMethodAccess.apply( keyAttribute.getAttributeName() ); + final var getterMethod = getterMethodAccess.apply( keyName ); if ( getterMethod != null ) { - return new GetterMethodImpl( - naturalIdClass, - keyAttribute.getAttributeName(), - getterMethod - ); + return new GetterMethodImpl( naturalIdClass, keyName, getterMethod ); } // lastly, look for a field try { - var field = naturalIdClass.getDeclaredField( keyAttribute.getAttributeName() ); - return new GetterFieldImpl( naturalIdClass, keyAttribute.getAttributeName(), field ); + return new GetterFieldImpl( naturalIdClass, keyName, + naturalIdClass.getDeclaredField( keyName ) ); } catch (NoSuchFieldException ignore) { } - throw new MappingException( "Unable to find NaturalIdClass accessor for natural-id attribute: " + keyAttribute.getAttributeName() ); + throw new MappingException( "Unable to find NaturalIdClass accessor for natural id attribute: " + keyName ); } private static Map extractGetterMethods(Class naturalIdClass) { - final Map result = new HashMap<>(); - - for ( Method declaredMethod : naturalIdClass.getDeclaredMethods() ) { + final Map result = new HashMap<>(); + for ( var declaredMethod : naturalIdClass.getDeclaredMethods() ) { if ( declaredMethod.getParameterCount() == 0 && declaredMethod.getReturnType() != void.class - && !Modifier.isStatic( declaredMethod.getModifiers() ) ) { + && !isStatic( declaredMethod.getModifiers() ) ) { var methodName = declaredMethod.getName(); if ( methodName.startsWith( "is" ) ) { - result.put( - Introspector.decapitalize( methodName.substring( 2 ) ), - declaredMethod - ); + result.put( decapitalize( methodName.substring( 2 ) ), + declaredMethod ); } else if ( methodName.startsWith( "get" ) ) { - result.put( - Introspector.decapitalize( methodName.substring( 3 ) ), - declaredMethod - ); + result.put( decapitalize( methodName.substring( 3 ) ), + declaredMethod ); } } } - return result; } private static Map extractComponents(Class naturalIdClass) { if ( !naturalIdClass.isRecord() ) { - return Map.of(); + return emptyMap(); } - final RecordComponent[] recordComponents = naturalIdClass.getRecordComponents(); + final var recordComponents = naturalIdClass.getRecordComponents(); final Map result = new HashMap<>(); for ( RecordComponent recordComponent : recordComponents ) { result.put( recordComponent.getName(), recordComponent ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationAttributeMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationAttributeMapping.java index 48809f49bd69..7d0b2cd0f208 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationAttributeMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationAttributeMapping.java @@ -466,7 +466,7 @@ public Serializable disassemble(Object value, SharedSessionContract session) { // this ^^ is what we want eventually, but for the time-being to ensure compatibility with // writing just reuse the AnyType - final SharedSessionContractImplementor persistenceContext = (SharedSessionContractImplementor) session; + final var persistenceContext = (SharedSessionContractImplementor) session; return anyType.disassemble( value, persistenceContext, null ); } @@ -477,7 +477,7 @@ public Object assemble(Serializable cached, SharedSessionContract session) { // again, what we want eventually ^^ versus what we should do now vv - final SharedSessionContractImplementor persistenceContext = (SharedSessionContractImplementor) session; + final var persistenceContext = (SharedSessionContractImplementor) session; return anyType.assemble( cached, persistenceContext, null ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationMapping.java index d5dbbe343c6a..8557e6e6f8dd 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/DiscriminatedAssociationMapping.java @@ -15,7 +15,6 @@ import org.hibernate.metamodel.mapping.BasicValuedModelPart; import org.hibernate.metamodel.mapping.DiscriminatedAssociationModelPart; import org.hibernate.metamodel.mapping.DiscriminatorMapping; -import org.hibernate.metamodel.mapping.DiscriminatorValueDetails; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.MappingType; import org.hibernate.metamodel.mapping.ModelPart; @@ -36,6 +35,7 @@ import org.hibernate.type.descriptor.java.JavaType; import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.getSelectablePath; +import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.getTableIdentifierExpression; /** * Represents the "type" of an any-valued mapping @@ -52,11 +52,11 @@ public static DiscriminatedAssociationMapping from( Any bootValueMapping, MappingModelCreationProcess creationProcess) { - final var dialect = creationProcess.getCreationContext().getDialect(); - final String tableName = MappingModelCreationHelper.getTableIdentifierExpression( - bootValueMapping.getTable(), - creationProcess - ); + final var creationContext = creationProcess.getCreationContext(); + final var sessionFactory = creationContext.getSessionFactory(); + final var dialect = creationContext.getDialect(); + final String tableName = + getTableIdentifierExpression( bootValueMapping.getTable(), creationProcess ); assert bootValueMapping.getColumnSpan() == 2; final var columnIterator = bootValueMapping.getSelectables().iterator(); @@ -70,7 +70,7 @@ public static DiscriminatedAssociationMapping from( assert !keySelectable.isFormula(); final var metaColumn = (Column) metaSelectable; final var keyColumn = (Column) keySelectable; - final SelectablePath parentSelectablePath = + final var parentSelectablePath = declaringModelPart.asAttributeMapping() != null ? getSelectablePath( declaringModelPart.asAttributeMapping().getDeclaringType() ) : null; @@ -81,7 +81,8 @@ public static DiscriminatedAssociationMapping from( declaringModelPart, tableName, metaColumn.getText( dialect ), - parentSelectablePath != null ? parentSelectablePath.append( metaColumn.getQuotedName( dialect ) ) + parentSelectablePath != null + ? parentSelectablePath.append( metaColumn.getQuotedName( dialect ) ) : new SelectablePath( metaColumn.getQuotedName( dialect ) ), metaColumn.getCustomReadExpression(), metaColumn.getCustomWriteExpression(), @@ -96,7 +97,7 @@ public static DiscriminatedAssociationMapping from( (BasicType) metaType.getBaseType(), metaType.getDiscriminatorValuesToEntityNameMap(), metaType.getImplicitValueStrategy(), - creationProcess.getCreationContext().getSessionFactory().getMappingMetamodel() + sessionFactory.getMappingMetamodel() ); @@ -106,7 +107,8 @@ public static DiscriminatedAssociationMapping from( declaringModelPart, tableName, keyColumn.getText( dialect ), - parentSelectablePath != null ? parentSelectablePath.append( keyColumn.getQuotedName( dialect ) ) + parentSelectablePath != null + ? parentSelectablePath.append( keyColumn.getQuotedName( dialect ) ) : new SelectablePath( keyColumn.getQuotedName( dialect ) ), keyColumn.getCustomReadExpression(), keyColumn.getCustomWriteExpression(), @@ -130,7 +132,7 @@ public static DiscriminatedAssociationMapping from( bootValueMapping.isLazy() ? FetchTiming.DELAYED : FetchTiming.IMMEDIATE, - creationProcess.getCreationContext().getSessionFactory() + sessionFactory ); } @@ -169,12 +171,10 @@ public BasicValuedModelPart getKeyPart() { } public Object resolveDiscriminatorValueToEntityMapping(EntityMappingType entityMappingType) { - final DiscriminatorValueDetails details = + final var details = discriminatorPart.getValueConverter() .getDetailsForEntityName( entityMappingType.getEntityName() ); - return details != null - ? details.getValue() - : null; + return details == null ? null : details.getValue(); } public EntityMappingType resolveDiscriminatorValueToEntityMapping(Object discriminatorValue) { @@ -294,7 +294,9 @@ private ModelPart resolveAssociatedSubPart(String name, EntityMappingType entity private void ensureMapped(EntityMappingType treatTarget) { assert treatTarget != null; - final DiscriminatorValueDetails details = discriminatorPart.getValueConverter().getDetailsForEntityName( treatTarget.getEntityName() ); + final var details = + discriminatorPart.getValueConverter() + .getDetailsForEntityName( treatTarget.getEntityName() ); if ( details == null ) { throw new IllegalArgumentException( String.format( diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddableMappingTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddableMappingTypeImpl.java index b957478d6c88..34b21c514f91 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddableMappingTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddableMappingTypeImpl.java @@ -17,12 +17,8 @@ import org.hibernate.MappingException; import org.hibernate.SharedSessionContract; -import org.hibernate.dialect.Dialect; import org.hibernate.engine.FetchTiming; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; -import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.mapping.AggregateColumn; import org.hibernate.mapping.Any; import org.hibernate.mapping.BasicValue; import org.hibernate.mapping.Column; @@ -65,12 +61,14 @@ import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan; import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.MutabilityPlan; -import org.hibernate.type.descriptor.jdbc.AggregateJdbcType; -import org.hibernate.type.descriptor.jdbc.JdbcTypeConstructor; -import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry; import org.hibernate.type.spi.CompositeTypeImplementor; -import org.hibernate.type.spi.TypeConfiguration; +import static java.lang.System.arraycopy; +import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.buildBasicAttributeMapping; +import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.buildEmbeddedAttributeMapping; +import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.buildPluralAttributeMapping; +import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.buildSingularAssociationAttributeMapping; +import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.getTableIdentifierExpression; import static org.hibernate.type.SqlTypes.ARRAY; import static org.hibernate.type.SqlTypes.JSON; import static org.hibernate.type.SqlTypes.JSON_ARRAY; @@ -203,9 +201,9 @@ private EmbeddableMappingTypeImpl( this.concreteEmbeddableBySubclass = null; } - final AggregateColumn aggregateColumn = bootDescriptor.getAggregateColumn(); + final var aggregateColumn = bootDescriptor.getAggregateColumn(); if ( aggregateColumn != null ) { - final Dialect dialect = creationContext.getDialect(); + final var dialect = creationContext.getDialect(); final boolean insertable; final boolean updatable; if ( componentProperty == null ) { @@ -232,9 +230,13 @@ private EmbeddableMappingTypeImpl( null, creationContext ); - final int defaultSqlTypeCode = aggregateMapping.getJdbcMapping().getJdbcType().getDefaultSqlTypeCode(); + final int defaultSqlTypeCode = + aggregateMapping.getJdbcMapping().getJdbcType().getDefaultSqlTypeCode(); final var aggregateSupport = dialect.getAggregateSupport(); - final int sqlTypeCode = defaultSqlTypeCode == ARRAY ? aggregateColumn.getTypeCode() : defaultSqlTypeCode; + final int sqlTypeCode = + defaultSqlTypeCode == ARRAY + ? aggregateColumn.getTypeCode() + : defaultSqlTypeCode; this.aggregateMappingRequiresColumnWriter = aggregateSupport .requiresAggregateCustomWriteExpressionRenderer( sqlTypeCode ); this.preferSelectAggregateMapping = aggregateSupport.preferSelectAggregateMapping( sqlTypeCode ); @@ -296,36 +298,36 @@ private JdbcMapping resolveJdbcMapping(Component bootDescriptor, RuntimeModelCre aggregateSqlTypeCode = aggregateColumnSqlTypeCode; break; } - final JdbcTypeRegistry jdbcTypeRegistry = typeConfiguration.getJdbcTypeRegistry(); - final AggregateJdbcType aggregateJdbcType = jdbcTypeRegistry.resolveAggregateDescriptor( + final var jdbcTypeRegistry = typeConfiguration.getJdbcTypeRegistry(); + final var aggregateJdbcType = jdbcTypeRegistry.resolveAggregateDescriptor( aggregateSqlTypeCode, structTypeName, this, creationContext ); - final BasicType basicType = basicTypeRegistry.resolve( - getMappedJavaType(), - aggregateJdbcType - ); + final var basicType = basicTypeRegistry.resolve( getMappedJavaType(), aggregateJdbcType ); // Register the resolved type under its struct name and java class name - if ( bootDescriptor.getStructName() != null ) { - basicTypeRegistry.register( basicType, bootDescriptor.getStructName().render() ); + final var structName = bootDescriptor.getStructName(); + if ( structName != null ) { + basicTypeRegistry.register( basicType, structName.render() ); basicTypeRegistry.register( basicType, getMappedJavaType().getJavaTypeClass().getName() ); } final BasicType resolvedJdbcMapping; if ( isArray ) { - final JdbcTypeConstructor arrayConstructor = jdbcTypeRegistry.getConstructor( aggregateColumnSqlTypeCode ); + final var arrayConstructor = jdbcTypeRegistry.getConstructor( aggregateColumnSqlTypeCode ); if ( arrayConstructor == null ) { throw new IllegalArgumentException( "No JdbcTypeConstructor registered for SqlTypes." + JdbcTypeNameMapper.getTypeName( aggregateColumnSqlTypeCode ) ); } //noinspection rawtypes,unchecked - final BasicType arrayType = ( (BasicPluralJavaType) resolution.getDomainJavaType() ).resolveType( - typeConfiguration, - creationContext.getDialect(), - basicType, - aggregateColumn, - typeConfiguration.getCurrentBaseSqlTypeIndicators() - ); + final BasicType arrayType = + ( (BasicPluralJavaType) resolution.getDomainJavaType() ) + .resolveType( + typeConfiguration, + creationContext.getDialect(), + basicType, + aggregateColumn, + typeConfiguration.getCurrentBaseSqlTypeIndicators() + ); basicTypeRegistry.register( arrayType ); resolvedJdbcMapping = arrayType; } @@ -356,7 +358,9 @@ public EmbeddableMappingTypeImpl( this.preferBindAggregateMapping = false; this.selectableMappings = selectableMappings; creationProcess.registerInitializationCallback( - "EmbeddableMappingType(" + inverseMappingType.getNavigableRole().getFullPath() + ".{inverse})#finishInitialization", + "EmbeddableMappingType(" + + inverseMappingType.getNavigableRole().getFullPath() + + ".{inverse})#finishInitialization", () -> inverseInitializeCallback( declaringTableGroupProducer, selectableMappings, @@ -418,13 +422,14 @@ private boolean finishInitialization( // ); // todo (6.0) - get this ^^ to work, or drop the comment - final TypeConfiguration typeConfiguration = creationProcess.getCreationContext().getTypeConfiguration(); - final JdbcServices jdbcServices = creationProcess.getCreationContext().getJdbcServices(); - final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment(); - final Dialect dialect = jdbcEnvironment.getDialect(); + final var creationContext = creationProcess.getCreationContext(); + final var typeConfiguration = creationContext.getTypeConfiguration(); + final var dialect = + creationContext.getJdbcServices() + .getJdbcEnvironment().getDialect(); final String baseTableExpression = valueMapping.getContainingTableExpression(); - final Type[] subtypes = compositeType.getSubtypes(); + final var subtypes = compositeType.getSubtypes(); int attributeIndex = 0; int columnPosition = 0; @@ -432,7 +437,7 @@ private boolean finishInitialization( // Reset the attribute mappings that were added in previous attempts attributeMappings.clear(); - for ( final Property bootPropertyDescriptor : bootDescriptor.getProperties() ) { + for ( final var bootPropertyDescriptor : bootDescriptor.getProperties() ) { final AttributeMapping attributeMapping; final Type subtype = subtypes[attributeIndex]; @@ -446,18 +451,13 @@ private boolean finishInitialization( final String containingTableExpression; final String columnExpression; if ( rootTableKeyColumnNames == null ) { - if ( selectable.isFormula() ) { - columnExpression = selectable.getTemplate( dialect, - creationProcess.getCreationContext().getTypeConfiguration() ); - } - else { - columnExpression = selectable.getText( dialect ); - } + columnExpression = + selectable.isFormula() + ? selectable.getTemplate( dialect, typeConfiguration ) + : selectable.getText( dialect ); if ( selectable instanceof Column column ) { - containingTableExpression = MappingModelCreationHelper.getTableIdentifierExpression( - column.getValue().getTable(), - creationProcess - ); + containingTableExpression = + getTableIdentifierExpression( column.getValue().getTable(), creationProcess ); } else { containingTableExpression = baseTableExpression; @@ -467,7 +467,9 @@ private boolean finishInitialization( containingTableExpression = rootTableExpression; columnExpression = rootTableKeyColumnNames[columnPosition]; } - final var role = valueMapping.getNavigableRole().append( bootPropertyDescriptor.getName() ); + final var role = + valueMapping.getNavigableRole() + .append( bootPropertyDescriptor.getName() ); final SelectablePath selectablePath; final String columnDefinition; final Long length; @@ -484,7 +486,7 @@ private boolean finishInitialization( precision = column.getPrecision(); scale = column.getScale(); temporalPrecision = column.getTemporalPrecision(); - isLob = column.isSqlTypeLob( creationProcess.getCreationContext().getMetadata() ); + isLob = column.isSqlTypeLob( creationContext.getMetadata() ); nullable = bootPropertyDescriptor.isOptional() && column.isNullable() ; selectablePath = basicValue.createSelectablePath( column.getQuotedName( dialect ) ); MappingModelCreationHelper.resolveAggregateColumnBasicType( creationProcess, role, column ); @@ -500,7 +502,7 @@ private boolean finishInitialization( nullable = bootPropertyDescriptor.isOptional(); selectablePath = new SelectablePath( determineEmbeddablePrefix() + bootPropertyDescriptor.getName() ); } - attributeMapping = MappingModelCreationHelper.buildBasicAttributeMapping( + attributeMapping = buildBasicAttributeMapping( bootPropertyDescriptor.getName(), role, attributeIndex, @@ -516,7 +518,7 @@ private boolean finishInitialization( selectable.getWriteExpr( basicValue.getResolution().getJdbcMapping(), dialect, - creationProcess.getCreationContext().getBootModel() + creationContext.getBootModel() ), columnDefinition, length, @@ -537,28 +539,24 @@ private boolean finishInitialization( } else if ( subtype instanceof AnyType anyType ) { final var bootValueMapping = (Any) value; - - final var propertyAccess = representationStrategy.resolvePropertyAccess( bootPropertyDescriptor ); - final boolean nullable = bootValueMapping.isNullable(); - final boolean insertable = insertability[columnPosition]; - final boolean updateable = updateability[columnPosition]; - final boolean includeInOptimisticLocking = bootPropertyDescriptor.isOptimisticLocked(); - final var cascadeStyle = compositeType.getCascadeStyle( attributeIndex ); - - SimpleAttributeMetadata attributeMetadataAccess = new SimpleAttributeMetadata( + final var propertyAccess = + representationStrategy.resolvePropertyAccess( bootPropertyDescriptor ); + final var attributeMetadataAccess = new SimpleAttributeMetadata( propertyAccess, - getMutabilityPlan( updateable ), - nullable, - insertable, - updateable, - includeInOptimisticLocking, + getMutabilityPlan( updateability[columnPosition] ), + bootValueMapping.isNullable(), + insertability[columnPosition], + updateability[columnPosition], + bootPropertyDescriptor.isOptimisticLocked(), true, - cascadeStyle + compositeType.getCascadeStyle( attributeIndex ) ); attributeMapping = new DiscriminatedAssociationAttributeMapping( - valueMapping.getNavigableRole().append( bootPropertyDescriptor.getName() ), - typeConfiguration.getJavaTypeRegistry().resolveDescriptor( Object.class ), + valueMapping.getNavigableRole() + .append( bootPropertyDescriptor.getName() ), + typeConfiguration.getJavaTypeRegistry() + .resolveDescriptor( Object.class ), this, attributeIndex, attributeIndex, @@ -572,7 +570,7 @@ else if ( subtype instanceof AnyType anyType ) { ); } else if ( subtype instanceof CompositeType subCompositeType ) { - final int columnSpan = subCompositeType.getColumnSpan( creationProcess.getCreationContext().getMetadata() ); + final int columnSpan = subCompositeType.getColumnSpan( creationContext.getMetadata() ); final String subTableExpression; final String[] subRootTableKeyColumnNames; if ( rootTableKeyColumnNames == null ) { @@ -582,10 +580,10 @@ else if ( subtype instanceof CompositeType subCompositeType ) { else { subTableExpression = rootTableExpression; subRootTableKeyColumnNames = new String[columnSpan]; - System.arraycopy( rootTableKeyColumnNames, columnPosition, subRootTableKeyColumnNames, 0, columnSpan ); + arraycopy( rootTableKeyColumnNames, columnPosition, subRootTableKeyColumnNames, 0, columnSpan ); } - attributeMapping = MappingModelCreationHelper.buildEmbeddedAttributeMapping( + attributeMapping = buildEmbeddedAttributeMapping( bootPropertyDescriptor.getName(), attributeIndex, attributeIndex, @@ -604,7 +602,7 @@ else if ( subtype instanceof CompositeType subCompositeType ) { columnPosition += columnSpan; } else if ( subtype instanceof CollectionType ) { - attributeMapping = MappingModelCreationHelper.buildPluralAttributeMapping( + attributeMapping = buildPluralAttributeMapping( bootPropertyDescriptor.getName(), attributeIndex, attributeIndex, @@ -617,7 +615,7 @@ else if ( subtype instanceof CollectionType ) { ); } else if ( subtype instanceof EntityType subentityType ) { - attributeMapping = MappingModelCreationHelper.buildSingularAssociationAttributeMapping( + attributeMapping = buildSingularAssociationAttributeMapping( bootPropertyDescriptor.getName(), valueMapping.getNavigableRole().append( bootPropertyDescriptor.getName() ), attributeIndex, @@ -708,7 +706,7 @@ public Object assemble(Serializable cached, SharedSessionContract session) { private EmbeddableDiscriminatorMapping generateDiscriminatorMapping( Component bootDescriptor, RuntimeModelCreationContext creationContext) { - final Value discriminator = bootDescriptor.getDiscriminator(); + final var discriminator = bootDescriptor.getDiscriminator(); if ( discriminator == null ) { return null; } @@ -723,7 +721,7 @@ private EmbeddableDiscriminatorMapping generateDiscriminatorMapping( final Integer scale; final boolean isFormula = discriminator.hasFormula(); if ( isFormula ) { - final Formula formula = (Formula) selectable; + final var formula = (Formula) selectable; discriminatorColumnExpression = name = formula.getTemplate( creationContext.getDialect(), creationContext.getTypeConfiguration() @@ -735,7 +733,7 @@ private EmbeddableDiscriminatorMapping generateDiscriminatorMapping( scale = null; } else { - final Column column = discriminator.getColumns().get( 0 ); + final var column = discriminator.getColumns().get( 0 ); assert column != null : "Embeddable discriminators require a column"; discriminatorColumnExpression = column.getReadExpr( creationContext.getDialect() ); columnDefinition = column.getSqlType(); @@ -1097,7 +1095,7 @@ public void forEachUpdatable(int offset, SelectableConsumer consumer) { else { final int jdbcTypeCount = selectableMappings.getJdbcTypeCount(); for ( int i = 0; i < jdbcTypeCount; i++ ) { - final SelectableMapping selectable = selectableMappings.getSelectable( i ); + final var selectable = selectableMappings.getSelectable( i ); if ( selectable.isUpdateable() ) { consumer.accept( offset + i, selectable ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedAttributeMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedAttributeMapping.java index 68e0aab1a2f6..f892b95e7e8a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedAttributeMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedAttributeMapping.java @@ -153,7 +153,9 @@ public EmbeddedAttributeMapping( : null ); - navigableRole = inverseModelPart.getNavigableRole().getParent().append( inverseModelPart.getFetchableName() ); + navigableRole = + inverseModelPart.getNavigableRole().getParent() + .append( inverseModelPart.getFetchableName() ); tableExpression = selectableMappings.getSelectable( 0 ).getContainingTableExpression(); embeddableMappingType = embeddableTypeDescriptor.createInverseMappingType( @@ -386,18 +388,20 @@ public boolean isSelectable() { @Override public boolean containsTableReference(String tableExpression) { - final var declaringType = getDeclaringType(); - final TableGroupProducer producer; + return tableGroupProducer( getDeclaringType() ) + .containsTableReference( tableExpression ); + } + + private static TableGroupProducer tableGroupProducer(ManagedMappingType declaringType) { if ( declaringType instanceof TableGroupProducer tableGroupProducer ) { - producer = tableGroupProducer; + return tableGroupProducer; } else if ( declaringType instanceof EmbeddableMappingType embeddableMappingType ) { - producer = embeddableMappingType.getEmbeddedValueMapping(); + return embeddableMappingType.getEmbeddedValueMapping(); } else { throw new AssertionFailure( "Unexpected declaring type" ); } - return producer.containsTableReference( tableExpression ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedCollectionPart.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedCollectionPart.java index c5d19af063b7..766efc1c3dfe 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedCollectionPart.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedCollectionPart.java @@ -28,7 +28,6 @@ import org.hibernate.sql.ast.SqlAstJoinType; import org.hibernate.sql.ast.spi.SqlAliasBase; import org.hibernate.sql.ast.spi.SqlAstCreationState; -import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.SqlTuple; @@ -199,8 +198,7 @@ public SqlTuple toSqlExpression( Clause clause, SqmToSqlAstConverter walker, SqlAstCreationState sqlAstCreationState) { - final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); - + final var sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); final List expressions = new ArrayList<>(); getEmbeddableTypeDescriptor().forEachSelectable( (columnIndex, selection) -> { diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedForeignKeyDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedForeignKeyDescriptor.java index ba2b89492cc7..cde0a6e48820 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedForeignKeyDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedForeignKeyDescriptor.java @@ -34,10 +34,8 @@ import org.hibernate.sql.ast.spi.SqlAstCreationState; 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.from.OneToManyTableGroup; import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableGroupJoin; import org.hibernate.sql.ast.tree.from.TableGroupProducer; import org.hibernate.sql.ast.tree.from.TableReference; import org.hibernate.sql.ast.tree.from.VirtualTableGroup; @@ -50,6 +48,8 @@ import org.hibernate.sql.results.graph.embeddable.internal.EmbeddableForeignKeyResultImpl; import org.hibernate.type.descriptor.java.JavaType; +import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.createInverseModelPart; + /** * @author Andrea Boriero */ @@ -100,7 +100,8 @@ public EmbeddedForeignKeyDescriptor( this.targetSelectableMappings = targetSelectableMappings; this.targetSide = new EmbeddedForeignKeyDescriptorSide( Nature.TARGET, targetMappingType ); this.keySide = new EmbeddedForeignKeyDescriptorSide( Nature.KEY, keyMappingType ); - final List columns = new ArrayList<>( keySelectableMappings.getJdbcTypeCount() ); + final List columns = + new ArrayList<>( keySelectableMappings.getJdbcTypeCount() ); keySelectableMappings.forEachSelectable( (columnIndex, selection) -> columns.add( selection.getSelectionExpression() ) ); @@ -132,7 +133,7 @@ private EmbeddedForeignKeyDescriptor( this.targetSide = original.targetSide; this.keySide = new EmbeddedForeignKeyDescriptorSide( Nature.KEY, - MappingModelCreationHelper.createInverseModelPart( + createInverseModelPart( original.targetSide.getModelPart(), keyDeclaringType, keyDeclaringTableGroupProducer, @@ -140,11 +141,10 @@ private EmbeddedForeignKeyDescriptor( creationProcess ) ); - final List columns = new ArrayList<>( keySelectableMappings.getJdbcTypeCount() ); + final List columns = + new ArrayList<>( keySelectableMappings.getJdbcTypeCount() ); keySelectableMappings.forEachSelectable( - (columnIndex, selection) -> { - columns.add( selection.getSelectionExpression() ); - } + (columnIndex, selection) -> columns.add( selection.getSelectionExpression() ) ); this.associationKey = new AssociationKey( keyTable, columns ); this.hasConstraint = original.hasConstraint; @@ -156,10 +156,7 @@ private EmbeddedForeignKeyDescriptor(EmbeddedForeignKeyDescriptor original, Embe this.keySide = original.keySide; this.targetTable = targetPart.getContainingTableExpression(); this.targetSelectableMappings = targetPart; - this.targetSide = new EmbeddedForeignKeyDescriptorSide( - Nature.TARGET, - targetPart - ); + this.targetSide = new EmbeddedForeignKeyDescriptorSide( Nature.TARGET, targetPart ); this.associationKey = original.associationKey; this.hasConstraint = original.hasConstraint; } @@ -317,19 +314,17 @@ public DomainResult createDomainResult( private boolean isTargetTableGroup(TableGroup tableGroup) { tableGroup = getUnderlyingTableGroup( tableGroup ); - final TableGroupProducer tableGroupProducer; - if ( tableGroup instanceof OneToManyTableGroup oneToManyTableGroup ) { - tableGroupProducer = (TableGroupProducer) oneToManyTableGroup.getElementTableGroup().getModelPart(); - } - else { - tableGroupProducer = (TableGroupProducer) tableGroup.getModelPart(); - } + final var tableGroupProducer = + tableGroup instanceof OneToManyTableGroup oneToManyTableGroup + ? (TableGroupProducer) oneToManyTableGroup.getElementTableGroup().getModelPart() + : (TableGroupProducer) tableGroup.getModelPart(); return tableGroupProducer.containsTableReference( targetSide.getModelPart().getContainingTableExpression() ); } private static TableGroup getUnderlyingTableGroup(TableGroup tableGroup) { if ( tableGroup.isVirtual() ) { - tableGroup = getUnderlyingTableGroup( ( (VirtualTableGroup) tableGroup ).getUnderlyingTableGroup() ); + final var virtualTableGroup = (VirtualTableGroup) tableGroup; + tableGroup = getUnderlyingTableGroup( virtualTableGroup.getUnderlyingTableGroup() ); } return tableGroup; } @@ -372,7 +367,7 @@ private DomainResult createDomainResult( creationState.getSqlAstCreationState().getFromClauseAccess().resolveTableGroup( resultNavigablePath, np -> { - final TableGroupJoin tableGroupJoin = modelPart.createTableGroupJoin( + final var tableGroupJoin = modelPart.createTableGroupJoin( resultNavigablePath, tableGroup, null, @@ -387,7 +382,8 @@ private DomainResult createDomainResult( } ); - final Nature currentForeignKeyResolvingKey = creationState.getCurrentlyResolvingForeignKeyPart(); + final Nature currentForeignKeyResolvingKey = + creationState.getCurrentlyResolvingForeignKeyPart(); try { creationState.setCurrentlyResolvingForeignKeyPart( nature ); return new EmbeddableForeignKeyResultImpl<>( @@ -408,15 +404,14 @@ public Predicate generateJoinPredicate( TableGroup targetSideTableGroup, TableGroup keySideTableGroup, SqlAstCreationState creationState) { - final TableReference lhsTableReference = targetSideTableGroup.resolveTableReference( + final var lhsTableReference = targetSideTableGroup.resolveTableReference( targetSideTableGroup.getNavigablePath(), targetTable ); - final TableReference rhsTableKeyReference = keySideTableGroup.resolveTableReference( + final var rhsTableKeyReference = keySideTableGroup.resolveTableReference( null, keyTable ); - return generateJoinPredicate( lhsTableReference, rhsTableKeyReference, creationState ); } @@ -428,7 +423,7 @@ public Predicate generateJoinPredicate( final var predicate = new Junction( Junction.Nature.CONJUNCTION ); targetSelectableMappings.forEachSelectable( (i, selection) -> { - final ComparisonPredicate comparisonPredicate = new ComparisonPredicate( + final var comparisonPredicate = new ComparisonPredicate( new ColumnReference( targetSideReference, selection ), ComparisonOperator.EQUAL, new ColumnReference( keySideReference, keySelectableMappings.getSelectable( i ) ) @@ -460,9 +455,9 @@ public boolean isSimpleJoinPredicate(Predicate predicate) { if ( comparisonPredicate.getOperator() != ComparisonOperator.EQUAL ) { return false; } - final Expression lhsExpr = comparisonPredicate.getLeftHandExpression(); - final Expression rhsExpr = comparisonPredicate.getRightHandExpression(); - if ( !(lhsExpr instanceof ColumnReference lhs) || !(rhsExpr instanceof ColumnReference rhs) ) { + final var lhsExpr = comparisonPredicate.getLeftHandExpression(); + final var rhsExpr = comparisonPredicate.getRightHandExpression(); + if ( !( lhsExpr instanceof ColumnReference lhs ) || !( rhsExpr instanceof ColumnReference rhs ) ) { return false; } if ( lhsIsKey == null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedIdentifierMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedIdentifierMappingImpl.java index 0ed88928c633..3c9cf6ff83c4 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedIdentifierMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EmbeddedIdentifierMappingImpl.java @@ -13,13 +13,13 @@ import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.property.access.spi.PropertyAccess; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.LazyInitializer; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.results.graph.DomainResultCreationState; +import static org.hibernate.proxy.HibernateProxy.extractLazyInitializer; + /** * Support for {@link jakarta.persistence.EmbeddedId} * @@ -78,12 +78,13 @@ public void applySqlSelections( TableGroup tableGroup, DomainResultCreationState creationState, BiConsumer selectionConsumer) { - getEmbeddableTypeDescriptor().applySqlSelections( navigablePath, tableGroup, creationState, selectionConsumer ); + getEmbeddableTypeDescriptor() + .applySqlSelections( navigablePath, tableGroup, creationState, selectionConsumer ); } @Override public Object getIdentifier(Object entity) { - final LazyInitializer lazyInitializer = HibernateProxy.extractLazyInitializer( entity ); + final var lazyInitializer = extractLazyInitializer( entity ); if ( lazyInitializer != null ) { return lazyInitializer.getInternalIdentifier(); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityVersionMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityVersionMappingImpl.java index e8f5a3062546..e5cd89f47096 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityVersionMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityVersionMappingImpl.java @@ -294,7 +294,6 @@ public Fetch generateFetch( fetchablePath, this, fetchTiming, - creationState, !sqlSelection.isVirtual() ); } @@ -306,7 +305,6 @@ public DomainResult createDomainResult( String resultVariable, DomainResultCreationState creationState) { final SqlSelection sqlSelection = resolveSqlSelection( tableGroup, creationState ); - return new BasicResult<>( sqlSelection.getValuesArrayPosition(), resultVariable, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ExplicitColumnDiscriminatorMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ExplicitColumnDiscriminatorMappingImpl.java index 4cdafde04d55..af4857008864 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ExplicitColumnDiscriminatorMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ExplicitColumnDiscriminatorMappingImpl.java @@ -124,16 +124,13 @@ public Expression resolveSqlExpression( JdbcMapping jdbcMappingToUse, TableGroup tableGroup, SqlAstCreationState creationState) { - final var expressionResolver = creationState.getSqlExpressionResolver(); final var tableReference = tableGroup.resolveTableReference( navigablePath, tableExpression ); - return expressionResolver.resolveSqlExpression( - createColumnReferenceKey( - tableGroup.getPrimaryTableReference(), - getSelectionExpression(), - jdbcMappingToUse - ), - processingState -> new ColumnReference( tableReference, this ) - ); + return creationState.getSqlExpressionResolver() + .resolveSqlExpression( + createColumnReferenceKey( tableGroup.getPrimaryTableReference(), + getSelectionExpression(), jdbcMappingToUse ), + processingState -> new ColumnReference( tableReference, this ) + ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/GeneratedValuesProcessor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/GeneratedValuesProcessor.java index 7c6b183476f0..fb984cb49e0f 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/GeneratedValuesProcessor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/GeneratedValuesProcessor.java @@ -182,7 +182,7 @@ private List executeSelect(Object id, SharedSessionContractImplementor private JdbcParameterBindings getJdbcParameterBindings(Object id, SharedSessionContractImplementor session) { final var jdbcParamBindings = new JdbcParameterBindingsImpl( jdbcParameters.size() ); - int offset = jdbcParamBindings.registerParametersForEachJdbcValue( + final int offset = jdbcParamBindings.registerParametersForEachJdbcValue( id, entityDescriptor.getIdentifierMapping(), jdbcParameters, diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/IdClassEmbeddable.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/IdClassEmbeddable.java index 266b7e0d32a2..bfc8328ba1ed 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/IdClassEmbeddable.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/IdClassEmbeddable.java @@ -34,6 +34,8 @@ import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.spi.CompositeTypeImplementor; +import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.getTableIdentifierExpression; + /** * EmbeddableMappingType implementation describing an {@link jakarta.persistence.IdClass} */ @@ -128,7 +130,7 @@ public IdClassEmbeddable( this.virtualIdEmbeddable = (VirtualIdEmbeddable) valueMapping.getEmbeddableTypeDescriptor(); this.javaType = inverseMappingType.javaType; this.representationStrategy = new IdClassRepresentationStrategy( this, false, () -> { - final String[] attributeNames = new String[inverseMappingType.getNumberOfAttributeMappings()]; + final var attributeNames = new String[inverseMappingType.getNumberOfAttributeMappings()]; for ( int i = 0; i < attributeNames.length; i++ ) { attributeNames[i] = inverseMappingType.getAttributeMapping( i ).getAttributeName(); } @@ -137,7 +139,9 @@ public IdClassEmbeddable( this.embedded = valueMapping; this.selectableMappings = selectableMappings; creationProcess.registerInitializationCallback( - "IdClassEmbeddable(" + inverseMappingType.getNavigableRole().getFullPath() + ".{inverse})#finishInitialization", + "IdClassEmbeddable(" + + inverseMappingType.getNavigableRole().getFullPath() + + ".{inverse})#finishInitialization", () -> inverseInitializeCallback( declaringTableGroupProducer, selectableMappings, @@ -332,7 +336,7 @@ private boolean finishInitialization( throw new IllegalAttributeType( "An IdClass cannot define attributes : " + attributeName ); } }, - (column, jdbcEnvironment) -> MappingModelCreationHelper.getTableIdentifierExpression( column.getValue().getTable(), creationProcess ), + (column, jdbcEnvironment) -> getTableIdentifierExpression( column.getValue().getTable(), creationProcess ), this::addAttribute, () -> { // We need the attribute mapping types to finish initialization first before we can build the column mappings diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/OneToManyCollectionPart.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/OneToManyCollectionPart.java index 0630e9ff28c0..d0a196ecee15 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/OneToManyCollectionPart.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/OneToManyCollectionPart.java @@ -234,14 +234,16 @@ public boolean finishInitialization( if ( pluralAttribute == null ) { return false; } - - final var foreignKey = pluralAttribute.getKeyDescriptor(); - if ( foreignKey == null ) { - return false; + else { + final var foreignKey = pluralAttribute.getKeyDescriptor(); + if ( foreignKey == null ) { + return false; + } + else { + fetchAssociationKey = foreignKey.getAssociationKey(); + return true; + } } - - fetchAssociationKey = foreignKey.getAssociationKey(); - return true; } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java index 1c135f1bf3c6..801284e877d2 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java @@ -189,7 +189,7 @@ public String getIndexPropertyName() { injectAttributeMapping( elementDescriptor, indexDescriptor, collectionDescriptor, this ); if ( elementDescriptor instanceof EntityCollectionPart elementMapping ) { - validateTargetEntity( elementMapping, declaringType, attributeName, propertyAccess, collectionDescriptor, creationProcess ); + validateTargetEntity( elementMapping, declaringType, attributeName, propertyAccess, creationProcess ); } } @@ -205,49 +205,30 @@ private static void validateTargetEntity( ManagedMappingType declaringType, String attributeName, PropertyAccess propertyAccess, - CollectionPersister collectionDescriptor, MappingModelCreationProcess creationProcess) { - final ManagedTypeRepresentationStrategy representationStrategy; - if ( declaringType instanceof EntityMappingType declaringEntityType ) { - representationStrategy = declaringEntityType.getRepresentationStrategy(); - } - else if ( declaringType instanceof EmbeddableMappingType declaringEmbeddableType ) { - representationStrategy = declaringEmbeddableType.getRepresentationStrategy(); - } - else { - // should never happen, but be lenient + final var representationStrategy = getTypeRepresentationStrategy( declaringType ); + if ( representationStrategy == null + // nothing to check against with dynamic models + || representationStrategy.getMode() != RepresentationMode.POJO ) { return; } - if ( representationStrategy.getMode() != RepresentationMode.POJO ) { - // nothing to check against with dynamic models - return; - } + var declaringClassDetails = + creationProcess.getCreationContext().getBootstrapContext() + .getModelsContext().getClassDetailsRegistry() + .resolveClassDetails( declaringType.getJavaType().getTypeName() ); - var modelsContext = creationProcess.getCreationContext().getBootstrapContext().getModelsContext(); - var classDetailsRegistry = modelsContext.getClassDetailsRegistry(); - var declaringClassDetails = classDetailsRegistry.resolveClassDetails( declaringType.getJavaType().getTypeName() ); - - final MemberDetails attributeMemberDetails; - if ( propertyAccess.getGetter().getMember() instanceof Field ) { - attributeMemberDetails = locateField( declaringClassDetails, attributeName ); - } - else if ( propertyAccess.getGetter().getMember() instanceof Method method ) { - attributeMemberDetails = locateGetter( declaringClassDetails, method ); - } - else { - // we need access to the field or getter... - return; - } + final var attributeMemberDetails = + getMemberDetails( attributeName, propertyAccess, declaringClassDetails ); if ( attributeMemberDetails == null ) { // generally indicates the case of embeddable inheritance mentioned // in the `implNote` return; } - var elementTypeDetails = attributeMemberDetails.getElementType(); - var elementType = elementTypeDetails.determineRawClass().toJavaClass(); - + var elementType = + attributeMemberDetails.getElementType() + .determineRawClass().toJavaClass(); if ( !Object.class.equals( elementType ) ) { var targetType = elementPart.getJavaType().getJavaTypeClass(); if ( !elementType.isAssignableFrom( targetType ) ) { @@ -265,6 +246,34 @@ else if ( propertyAccess.getGetter().getMember() instanceof Method method ) { } } + private static @Nullable MemberDetails getMemberDetails( + String attributeName, PropertyAccess propertyAccess, ClassDetails declaringClassDetails) { + final var member = propertyAccess.getGetter().getMember(); + if ( member instanceof Field ) { + return locateField( declaringClassDetails, attributeName ); + } + else if ( member instanceof Method method ) { + return locateGetter( declaringClassDetails, method ); + } + else { + // we need access to the field or getter... + return null; + } + } + + private static @Nullable ManagedTypeRepresentationStrategy getTypeRepresentationStrategy(ManagedMappingType declaringType) { + if ( declaringType instanceof EntityMappingType declaringEntityType ) { + return declaringEntityType.getRepresentationStrategy(); + } + else if ( declaringType instanceof EmbeddableMappingType declaringEmbeddableType ) { + return declaringEmbeddableType.getRepresentationStrategy(); + } + else { + // should never happen, but be lenient + return null; + } + } + /** * Locate the corresponding field details. * @@ -277,7 +286,7 @@ private static FieldDetails locateField(ClassDetails declaringClassDetails, Stri assert declaringClassDetails != null; var classDetails = declaringClassDetails; while ( classDetails != null && classDetails != ClassDetails.OBJECT_CLASS_DETAILS ) { - var fieldDetails = classDetails.findFieldByName( attributeName ); + final var fieldDetails = classDetails.findFieldByName( attributeName ); if ( fieldDetails != null ) { return fieldDetails; } @@ -299,7 +308,7 @@ private static MethodDetails locateGetter(ClassDetails declaringClassDetails, Me var classDetails = declaringClassDetails; while ( classDetails != null && classDetails != ClassDetails.OBJECT_CLASS_DETAILS ) { for ( int i = 0; i < classDetails.getMethods().size(); i++ ) { - var methodDetails = classDetails.getMethods().get(i); + final var methodDetails = classDetails.getMethods().get(i); if ( methodDetails.getName().equals( method.getName() ) && methodDetails.getMethodKind() == MethodDetails.MethodKind.GETTER ) { return methodDetails; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SelectableMappingsImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SelectableMappingsImpl.java index 7c0871166ad1..a9828c62b623 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SelectableMappingsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SelectableMappingsImpl.java @@ -38,12 +38,12 @@ public SelectableMappingsImpl(SelectableMapping[] selectableMappings) { } private static void resolveJdbcMappings(List jdbcMappings, MappingContext mapping, Type valueType) { - final Type keyType = + final var keyType = valueType instanceof EntityType entityType ? entityType.getIdentifierOrUniqueKeyType( mapping ) : valueType; if ( keyType instanceof CompositeType compositeType ) { - for ( Type subtype : compositeType.getSubtypes() ) { + for ( var subtype : compositeType.getSubtypes() ) { resolveJdbcMappings( jdbcMappings, mapping, subtype ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleForeignKeyDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleForeignKeyDescriptor.java index aed1ace3cc83..c4dda9808538 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleForeignKeyDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleForeignKeyDescriptor.java @@ -387,7 +387,8 @@ private DomainResult createDomainResult( selectableMapping.getJdbcMapping(), navigablePath, // if the expression type is different that the expected type coerce the value - selectionType != null && selectionType.getSingleJdbcMapping().getJdbcJavaType() != javaType, + selectionType != null + && selectionType.getSingleJdbcMapping().getJdbcJavaType() != javaType, !sqlSelection.isVirtual() ); } @@ -500,7 +501,8 @@ public Object getAssociationKeyFromSide( } final var modelPart = side.getModelPart(); if ( modelPart.isEntityIdentifierMapping() ) { - return ( (EntityIdentifierMapping) modelPart ).getIdentifierIfNotUnsaved( targetObject, session ); + return ( (EntityIdentifierMapping) modelPart ) + .getIdentifierIfNotUnsaved( targetObject, session ); } if ( lazyInitializer == null && isPersistentAttributeInterceptable( targetObject ) ) { @@ -511,7 +513,8 @@ public Object getAssociationKeyFromSide( } } - return ( (PropertyBasedMapping) modelPart ).getPropertyAccess().getGetter().get( targetObject ); + return ( (PropertyBasedMapping) modelPart ) + .getPropertyAccess().getGetter().get( targetObject ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ToOneAttributeMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ToOneAttributeMapping.java index 2ea28fad2a9c..05d6590c3f7b 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ToOneAttributeMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ToOneAttributeMapping.java @@ -19,7 +19,6 @@ import org.hibernate.internal.util.collections.ArrayHelper; import org.hibernate.mapping.Collection; import org.hibernate.mapping.Component; -import org.hibernate.mapping.Join; import org.hibernate.mapping.ManyToOne; import org.hibernate.mapping.OneToOne; import org.hibernate.mapping.Property; @@ -292,7 +291,8 @@ public ToOneAttributeMapping( ? Cardinality.LOGICAL_ONE_TO_ONE : Cardinality.MANY_TO_ONE; final var entityBinding = - manyToOne.getMetadata().getEntityBinding( manyToOne.getReferencedEntityName() ); + manyToOne.getMetadata() + .getEntityBinding( manyToOne.getReferencedEntityName() ); if ( referencedPropertyName == null ) { SelectablePath bidirectionalAttributeName = null; final String propertyPath = @@ -302,7 +302,7 @@ public ToOneAttributeMapping( if ( cardinality == Cardinality.LOGICAL_ONE_TO_ONE ) { boolean hasJoinTable = false; // Handle join table cases - for ( Join join : entityBinding.getJoinClosure() ) { + for ( var join : entityBinding.getJoinClosure() ) { if ( join.getPersistentClass().getEntityName().equals( entityBinding.getEntityName() ) && join.getPropertySpan() == 1 && join.getTable() == manyToOne.getTable() @@ -504,7 +504,9 @@ the navigable path is NavigablePath(Card.fields.{element}.{id}.card) and it does final var entityBinding = bootValue.getBuildingContext().getMetadataCollector() .getEntityBinding( entityMappingType.getEntityName() ); - final Type propertyType = entityBinding.getRecursiveProperty( referencedPropertyName ).getType(); + final var propertyType = + entityBinding.getRecursiveProperty( referencedPropertyName ) + .getType(); if ( bootValue.isReferenceToPrimaryKey() ) { this.targetKeyPropertyName = referencedPropertyName; final Set targetKeyPropertyNames = new HashSet<>( 3 ); @@ -544,13 +546,11 @@ the navigable path is NavigablePath(Card.fields.{element}.{id}.card) and it does else { final Set targetKeyPropertyNames = new HashSet<>( 2 ); this.targetKeyPropertyName = referencedPropertyName; - final String mapsIdAttributeName; + final String mapsIdAttributeName = + findMapsIdPropertyName( entityMappingType, referencedPropertyName ); // If there is a "virtual property" for a non-PK join mapping, we try to see if the columns match the // primary key columns and if so, we add the primary key property name as target key property - if ( ( mapsIdAttributeName = findMapsIdPropertyName( - entityMappingType, - referencedPropertyName - ) ) != null ) { + if ( mapsIdAttributeName != null ) { addPrefixedPropertyPaths( targetKeyPropertyNames, mapsIdAttributeName, @@ -581,10 +581,10 @@ private static SelectablePath findBidirectionalOneToManyAttributeName( ManagedMappingType declaringType, SelectablePath parentSelectablePath, java.util.Collection properties) { - for ( Property property : properties ) { - final Value value = property.getValue(); + for ( var property : properties ) { + final var value = property.getValue(); if ( value instanceof Component component ) { - final SelectablePath bidirectionalAttributeName = findBidirectionalOneToManyAttributeName( + final var bidirectionalAttributeName = findBidirectionalOneToManyAttributeName( propertyPath, declaringType, parentSelectablePath == null @@ -614,8 +614,8 @@ private SelectablePath findBidirectionalOneToOneAttributeName( ManagedMappingType declaringType, SelectablePath parentSelectablePath, java.util.Collection properties) { - for ( Property property : properties ) { - final Value value = property.getValue(); + for ( var property : properties ) { + final var value = property.getValue(); if ( value instanceof Component component ) { final var bidirectionalAttributeName = findBidirectionalOneToOneAttributeName( @@ -768,15 +768,15 @@ public static void addPrefixedPropertyNames( targetKeyPropertyNames.add( prefix ); } if ( type instanceof ComponentType componentType ) { - final String[] propertyNames = componentType.getPropertyNames(); - final Type[] componentTypeSubtypes = componentType.getSubtypes(); + final var propertyNames = componentType.getPropertyNames(); + final var componentTypeSubtypes = componentType.getSubtypes(); for ( int i = 0, propertyNamesLength = propertyNames.length; i < propertyNamesLength; i++ ) { final String newPrefix = prefix == null ? propertyNames[i] : prefix + "." + propertyNames[i]; addPrefixedPropertyNames( targetKeyPropertyNames, newPrefix, componentTypeSubtypes[i], factory ); } } else if ( type instanceof EntityType entityType ) { - final Type identifierOrUniqueKeyType = + final var identifierOrUniqueKeyType = entityType.getIdentifierOrUniqueKeyType( factory.getRuntimeMetamodels() ); final String propertyName; if ( entityType.isReferenceToPrimaryKey() ) { @@ -1250,7 +1250,7 @@ class Mother { private boolean isParentEmbeddedCollectionPart(DomainResultCreationState creationState, NavigablePath parentNavigablePath) { while ( parentNavigablePath != null ) { - final ModelPart parentModelPart = creationState.resolveModelPart( parentNavigablePath ); + final var parentModelPart = creationState.resolveModelPart( parentNavigablePath ); if ( parentModelPart instanceof EmbeddedCollectionPart ) { return true; } @@ -2035,8 +2035,8 @@ public TableGroupJoin createTableGroupJoin( embeddablePathSb = new StringBuilder(); } embeddablePathSb.insert( 0, parentContainer.getPartName() + "." ); - final NavigablePath parentNavigablePath = parentTableGroup.getNavigablePath(); - final TableGroup tableGroup = fromClauseAccess.findTableGroup( parentNavigablePath.getParent() ); + final var parentNavigablePath = parentTableGroup.getNavigablePath(); + final var tableGroup = fromClauseAccess.findTableGroup( parentNavigablePath.getParent() ); if ( tableGroup == null ) { assert parentNavigablePath.getLocalName().equals( ForeignKeyDescriptor.PART_NAME ) || parentNavigablePath.getLocalName().equals( ForeignKeyDescriptor.TARGET_PART_NAME ); @@ -2198,7 +2198,7 @@ public LazyTableGroup createRootTableGroupJoin( boolean fetched, @Nullable Consumer predicateConsumer, SqlAstCreationState creationState) { - final SqlAliasBase sqlAliasBase = SqlAliasBase.from( + final var sqlAliasBase = SqlAliasBase.from( explicitSqlAliasBase, explicitSourceAlias, this, @@ -2485,7 +2485,7 @@ protected static Object extractAttributePathValue(Object domainValue, EntityMapp Object value = domainValue; ManagedMappingType managedType = entityType; - final String[] pathParts = StringHelper.split( ".", attributePath ); + final var pathParts = StringHelper.split( ".", attributePath ); for ( int i = 0; i < pathParts.length; i++ ) { assert managedType != null; @@ -2503,12 +2503,9 @@ protected static Object extractAttributePathValue(Object domainValue, EntityMapp @Override public int forEachSelectable(int offset, SelectableConsumer consumer) { - if ( sideNature == ForeignKeyDescriptor.Nature.KEY ) { - return foreignKeyDescriptor.visitKeySelectables( offset, consumer ); - } - else { - return 0; - } + return sideNature == ForeignKeyDescriptor.Nature.KEY + ? foreignKeyDescriptor.visitKeySelectables( offset, consumer ) + : 0; } @Override @@ -2539,20 +2536,16 @@ public void applySqlSelections( @Override public String getContainingTableExpression() { - if ( sideNature == ForeignKeyDescriptor.Nature.KEY ) { - return foreignKeyDescriptor.getKeyTable(); - } - else { - return foreignKeyDescriptor.getTargetTable(); - } + return sideNature == ForeignKeyDescriptor.Nature.KEY + ? foreignKeyDescriptor.getKeyTable() + : foreignKeyDescriptor.getTargetTable(); } @Override public int getJdbcTypeCount() { - if ( sideNature == ForeignKeyDescriptor.Nature.KEY ) { - return foreignKeyDescriptor.getJdbcTypeCount(); - } - return 0; + return sideNature == ForeignKeyDescriptor.Nature.KEY + ? foreignKeyDescriptor.getJdbcTypeCount() + : 0; } @Override @@ -2562,10 +2555,9 @@ public JdbcMapping getJdbcMapping(final int index) { @Override public SelectableMapping getSelectable(int columnIndex) { - if ( sideNature == ForeignKeyDescriptor.Nature.KEY ) { - return foreignKeyDescriptor.getSelectable( columnIndex ); - } - return null; + return sideNature == ForeignKeyDescriptor.Nature.KEY + ? foreignKeyDescriptor.getSelectable( columnIndex ) + : null; } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/VirtualIdEmbeddable.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/VirtualIdEmbeddable.java index f1f69e3f4a3c..cc577960c98a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/VirtualIdEmbeddable.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/VirtualIdEmbeddable.java @@ -54,7 +54,8 @@ public VirtualIdEmbeddable( ); final var compositeType = virtualIdSource.getType(); - ( (CompositeTypeImplementor) compositeType ).injectMappingModelPart( idMapping, creationProcess ); + ( (CompositeTypeImplementor) compositeType ) + .injectMappingModelPart( idMapping, creationProcess ); creationProcess.registerInitializationCallback( "VirtualIdEmbeddable(" + navigableRole.getFullPath() + ")#finishInitialization", diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index ba839acb8145..dee04d4063bd 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -1283,14 +1283,13 @@ public DomainResult createDomainResult( TableGroup tableGroup, String resultVariable, DomainResultCreationState creationState) { - final var entityResult = new EntityResultImpl( + final var entityResult = new EntityResultImpl( navigablePath, this, tableGroup, resultVariable ); entityResult.afterInitialize( entityResult, creationState ); - //noinspection unchecked return entityResult; } diff --git a/hibernate-core/src/main/java/org/hibernate/procedure/internal/EntityDomainResultBuilder.java b/hibernate-core/src/main/java/org/hibernate/procedure/internal/EntityDomainResultBuilder.java index 3474537561be..f5b77b6f44b2 100644 --- a/hibernate-core/src/main/java/org/hibernate/procedure/internal/EntityDomainResultBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/procedure/internal/EntityDomainResultBuilder.java @@ -28,16 +28,11 @@ class EntityDomainResultBuilder implements ResultBuilder { EntityDomainResultBuilder(EntityMappingType entityDescriptor) { this.entityDescriptor = entityDescriptor; this.navigablePath = new NavigablePath( entityDescriptor.getEntityName() ); - final EntityDiscriminatorMapping discriminatorMapping = entityDescriptor.getDiscriminatorMapping(); - if ( discriminatorMapping == null ) { - this.discriminatorFetchBuilder = null; - } - else { - this.discriminatorFetchBuilder = new ImplicitFetchBuilderBasic( - navigablePath, - discriminatorMapping - ); - } + final var discriminatorMapping = entityDescriptor.getDiscriminatorMapping(); + this.discriminatorFetchBuilder = + discriminatorMapping == null + ? null + : new ImplicitFetchBuilderBasic( navigablePath, discriminatorMapping ); } @Override @@ -51,12 +46,12 @@ public ResultBuilder cacheKeyInstance() { } @Override - public EntityResult buildResult( + public EntityResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { - return new EntityResultImpl( + return new EntityResultImpl<>( navigablePath, entityDescriptor, null, @@ -77,16 +72,16 @@ public EntityResult buildResult( } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof EntityDomainResultBuilder that ) ) { return false; } - - final EntityDomainResultBuilder that = (EntityDomainResultBuilder) o; - return entityDescriptor.equals( that.entityDescriptor ); + else { + return entityDescriptor.equals( that.entityDescriptor ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ScalarDomainResultBuilder.java b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ScalarDomainResultBuilder.java index 3c21c2a2987f..27508941a6bc 100644 --- a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ScalarDomainResultBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ScalarDomainResultBuilder.java @@ -7,15 +7,14 @@ import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.query.results.ResultBuilder; import org.hibernate.query.results.internal.ResultSetMappingSqlSelection; -import org.hibernate.sql.ast.spi.SqlExpressionResolver; -import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.basic.BasicResult; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; import org.hibernate.type.BasicType; import org.hibernate.type.descriptor.java.JavaType; -import org.hibernate.type.spi.TypeConfiguration; + +import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createColumnReferenceKey; /** * @author Steve Ebersole @@ -37,17 +36,18 @@ public DomainResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { - final SqlExpressionResolver sqlExpressionResolver = - domainResultCreationState.getSqlAstCreationState().getSqlExpressionResolver(); - final TypeConfiguration typeConfiguration = - domainResultCreationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration(); - final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( + final var sqlAstCreationState = domainResultCreationState.getSqlAstCreationState(); + final var sqlExpressionResolver = + sqlAstCreationState.getSqlExpressionResolver(); + final var typeConfiguration = + sqlAstCreationState.getCreationContext().getTypeConfiguration(); + final var sqlSelection = sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlExpression( - SqlExpressionResolver.createColumnReferenceKey( + createColumnReferenceKey( Integer.toString( resultPosition + 1 ) ), processingState -> { - final BasicType basicType = jdbcResultsMetadata.resolveType( + final var basicType = jdbcResultsMetadata.resolveType( resultPosition + 1, typeDescriptor, typeConfiguration @@ -75,17 +75,16 @@ public ResultBuilder cacheKeyInstance() { } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof ScalarDomainResultBuilder that ) ) { return false; } - - ScalarDomainResultBuilder that = (ScalarDomainResultBuilder) o; - - return typeDescriptor.equals( that.typeDescriptor ); + else { + return typeDescriptor.equals( that.typeDescriptor ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/ResultBuilderEntityValued.java b/hibernate-core/src/main/java/org/hibernate/query/results/ResultBuilderEntityValued.java index 2171d133b976..d22eb84dbbe9 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/ResultBuilderEntityValued.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/ResultBuilderEntityValued.java @@ -17,7 +17,7 @@ */ public interface ResultBuilderEntityValued extends ResultBuilder { @Override - EntityResult buildResult( + EntityResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState); diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/DomainResultCreationStateImpl.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/DomainResultCreationStateImpl.java index cf38c55f2281..8ad9b54376a1 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/DomainResultCreationStateImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/DomainResultCreationStateImpl.java @@ -4,6 +4,8 @@ */ package org.hibernate.query.results.internal; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.Internal; import org.hibernate.LockMode; import org.hibernate.engine.FetchTiming; @@ -12,11 +14,9 @@ import org.hibernate.internal.util.collections.Stack; import org.hibernate.internal.util.collections.StandardStack; import org.hibernate.metamodel.mapping.Association; -import org.hibernate.metamodel.mapping.EntityIdentifierMapping; -import org.hibernate.metamodel.mapping.EntityValuedModelPart; import org.hibernate.metamodel.mapping.ForeignKeyDescriptor; import org.hibernate.metamodel.mapping.ModelPart; -import org.hibernate.metamodel.mapping.internal.CaseStatementDiscriminatorMappingImpl; +import org.hibernate.metamodel.mapping.internal.CaseStatementDiscriminatorMappingImpl.CaseStatementDiscriminatorExpression; import org.hibernate.query.results.FetchBuilder; import org.hibernate.query.results.LegacyFetchBuilder; import org.hibernate.spi.EntityIdentifierNavigablePath; @@ -30,12 +30,10 @@ 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.from.TableGroup; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.Fetch; import org.hibernate.sql.results.graph.FetchParent; import org.hibernate.sql.results.graph.Fetchable; -import org.hibernate.sql.results.graph.FetchableContainer; import org.hibernate.sql.results.graph.entity.EntityResultGraphNode; import org.hibernate.sql.results.graph.internal.ImmutableFetchList; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; @@ -47,7 +45,9 @@ import java.util.function.Consumer; import java.util.function.Function; +import static org.hibernate.query.results.internal.Builders.implicitFetchBuilder; import static org.hibernate.query.results.internal.ResultsHelper.attributeName; +import static org.hibernate.query.results.internal.ResultsHelper.jdbcPositionToValuesArrayPosition; import static org.hibernate.sql.results.ResultsLogger.RESULTS_LOGGER; /** @@ -82,7 +82,7 @@ public class DomainResultCreationStateImpl private boolean processingKeyFetches = false; private boolean resolvingCircularFetch; private ForeignKeyDescriptor.Nature currentlyResolvingForeignKeySide; - private boolean isProcedureOrNativeQuery; + private final boolean isProcedureOrNativeQuery; public DomainResultCreationStateImpl( String stateIdentifier, @@ -132,7 +132,7 @@ public void pushExplicitFetchMementoResolver(Function r } public Function getCurrentExplicitFetchMementoResolver() { - return fetchBuilderResolverStack.getCurrent(); + return currentFetchBuilderResolver(); } public Function popExplicitFetchMementoResolver() { @@ -146,7 +146,7 @@ public void withExplicitFetchMementoResolver(Function r runnable.run(); } finally { - final Function popped = popExplicitFetchMementoResolver(); + final var popped = popExplicitFetchMementoResolver(); assert popped == resolver; } } @@ -172,15 +172,17 @@ public SqlAliasBaseManager getSqlAliasBaseManager() { @Override public ModelPart resolveModelPart(NavigablePath navigablePath) { - final TableGroup tableGroup = fromClauseAccess.findTableGroup( navigablePath ); + final var tableGroup = fromClauseAccess.findTableGroup( navigablePath ); if ( tableGroup != null ) { return tableGroup.getModelPart(); } - if ( navigablePath.getParent() != null ) { - final TableGroup parentTableGroup = fromClauseAccess.findTableGroup( navigablePath.getParent() ); + final var parentPath = navigablePath.getParent(); + if ( parentPath != null ) { + final var parentTableGroup = fromClauseAccess.findTableGroup( parentPath ); if ( parentTableGroup != null ) { - return parentTableGroup.getModelPart().findSubPart( navigablePath.getLocalName(), null ); + return parentTableGroup.getModelPart() + .findSubPart( navigablePath.getLocalName(), null ); } } @@ -198,7 +200,7 @@ public DomainResultCreationStateImpl getSqlExpressionResolver() { @Override public void registerLockMode(String identificationVariable, LockMode explicitLockMode) { - if (registeredLockModes == null ) { + if ( registeredLockModes == null ) { registeredLockModes = new HashMap<>(); } registeredLockModes.put( identificationVariable, explicitLockMode ); @@ -250,60 +252,45 @@ public SqlAstProcessingState getParentState() { public Expression resolveSqlExpression( ColumnReferenceKey key, Function creator) { - final ResultSetMappingSqlSelection existing = sqlSelectionMap.get( key ); - if ( existing != null ) { - return existing; - } + final var existing = sqlSelectionMap.get( key ); + return existing != null ? existing : createSqlSelection( key, creator ); + } - final Expression created = creator.apply( this ); + private Expression createSqlSelection( + ColumnReferenceKey key, + Function creator) { + final var created = creator.apply( this ); + final ResultSetMappingSqlSelection sqlSelection; if ( created instanceof ResultSetMappingSqlSelection resultSetMappingSqlSelection ) { - sqlSelectionMap.put( key, resultSetMappingSqlSelection ); - sqlSelectionConsumer.accept( resultSetMappingSqlSelection ); + sqlSelection = resultSetMappingSqlSelection; } else if ( created instanceof ColumnReference columnReference) { - final String selectableName = columnReference.getSelectableName(); - final int valuesArrayPosition; - if ( nestingFetchParent != null ) { - valuesArrayPosition = nestingFetchParent.getReferencedMappingType().getSelectableIndex( selectableName ); - } - else { - final int jdbcPosition = jdbcResultsMetadata.resolveColumnPosition( selectableName ); - valuesArrayPosition = ResultsHelper.jdbcPositionToValuesArrayPosition( jdbcPosition ); - } - - final ResultSetMappingSqlSelection sqlSelection = new ResultSetMappingSqlSelection( - valuesArrayPosition, - columnReference.getJdbcMapping() - ); - - sqlSelectionMap.put( key, sqlSelection ); - sqlSelectionConsumer.accept( sqlSelection ); - - return sqlSelection; + sqlSelection = + new ResultSetMappingSqlSelection( + valuesArrayPosition( columnReference.getSelectableName() ), + columnReference.getJdbcMapping() + ); } - else if ( created instanceof CaseStatementDiscriminatorMappingImpl.CaseStatementDiscriminatorExpression ) { - final int valuesArrayPosition; - if ( nestingFetchParent != null ) { - valuesArrayPosition = nestingFetchParent.getReferencedMappingType().getSelectableIndex( DISCRIMINATOR_ALIAS ); - } - else { - final int jdbcPosition = jdbcResultsMetadata.resolveColumnPosition( DISCRIMINATOR_ALIAS ); - valuesArrayPosition = ResultsHelper.jdbcPositionToValuesArrayPosition( jdbcPosition ); - } - - final ResultSetMappingSqlSelection sqlSelection = new ResultSetMappingSqlSelection( - valuesArrayPosition, + else if ( created instanceof CaseStatementDiscriminatorExpression ) { + sqlSelection = new ResultSetMappingSqlSelection( + valuesArrayPosition( DISCRIMINATOR_ALIAS ), created.getExpressionType().getSingleJdbcMapping() ); - - sqlSelectionMap.put( key, sqlSelection ); - sqlSelectionConsumer.accept( sqlSelection ); - - return sqlSelection; } + else { + return created; + } + + sqlSelectionMap.put( key, sqlSelection ); + sqlSelectionConsumer.accept( sqlSelection ); + return sqlSelection; + } - return created; + private int valuesArrayPosition(String selectableName) { + return nestingFetchParent != null + ? nestingFetchParent.getReferencedMappingType().getSelectableIndex( selectableName ) + : jdbcPositionToValuesArrayPosition( jdbcResultsMetadata.resolveColumnPosition( selectableName ) ); } @Override @@ -314,8 +301,10 @@ public SqlSelection resolveSqlSelection( if ( expression == null ) { throw new IllegalArgumentException( "Expression cannot be null" ); } - assert expression instanceof ResultSetMappingSqlSelection; - return (SqlSelection) expression; + if ( !(expression instanceof ResultSetMappingSqlSelection sqlSelection) ) { + throw new IllegalArgumentException( "Expression must be a ResultSetMappingSqlSelection" ); + } + return sqlSelection; } private static class LegacyFetchResolver { @@ -329,71 +318,78 @@ public LegacyFetchBuilder resolve(String ownerTableAlias, Fetchable fetchedPart) if ( legacyFetchBuilders == null ) { return null; } - - final Map fetchBuilders = legacyFetchBuilders.get( ownerTableAlias ); - if ( fetchBuilders == null ) { - return null; + else { + final var fetchBuilders = legacyFetchBuilders.get( ownerTableAlias ); + return fetchBuilders == null ? null : fetchBuilders.get( fetchedPart ); } - - return fetchBuilders.get( fetchedPart ); } } @Override public R withNestedFetchParent(FetchParent fetchParent, Function action) { - final FetchParent oldNestingFetchParent = this.nestingFetchParent; + final var oldNestingFetchParent = this.nestingFetchParent; this.nestingFetchParent = fetchParent; final R result = action.apply( fetchParent ); this.nestingFetchParent = oldNestingFetchParent; return result; } - @Override - public Fetch visitIdentifierFetch(EntityResultGraphNode fetchParent) { - final EntityValuedModelPart parentModelPart = fetchParent.getEntityValuedModelPart(); - final EntityIdentifierMapping identifierMapping = parentModelPart.getEntityMappingType().getIdentifierMapping(); - final String identifierAttributeName = attributeName( identifierMapping ); + private @NonNull FetchBuilder fetchBuilder( + Fetchable fetchable, + FetchBuilder explicitFetchBuilder, + LegacyFetchBuilder fetchBuilderLegacy, + NavigablePath fetchPath) { + if ( explicitFetchBuilder != null ) { + return explicitFetchBuilder; + } + else if ( fetchBuilderLegacy != null ) { + return fetchBuilderLegacy; + } + else { + return implicitFetchBuilder( fetchPath, fetchable, this ); + } + } - final FetchBuilder explicitFetchBuilder = fetchBuilderResolverStack.getCurrent().apply( identifierMapping ); - final LegacyFetchBuilder fetchBuilderLegacy; + private @Nullable LegacyFetchBuilder legacyFetchBuilder( + Fetchable fetchable, FetchParent fetchParent, + FetchBuilder explicitFetchBuilder) { if ( explicitFetchBuilder == null ) { - fetchBuilderLegacy = legacyFetchResolver.resolve( + return legacyFetchResolver.resolve( fromClauseAccess.findTableGroup( fetchParent.getNavigablePath() ) .getPrimaryTableReference() .getIdentificationVariable(), - identifierMapping + fetchable ); } else { - fetchBuilderLegacy = null; + return null; } + } + + @Override + public Fetch visitIdentifierFetch(EntityResultGraphNode fetchParent) { + final var identifierMapping = + fetchParent.getEntityValuedModelPart() + .getEntityMappingType().getIdentifierMapping(); - final EntityIdentifierNavigablePath fetchPath = new EntityIdentifierNavigablePath( - fetchParent.getNavigablePath(), - identifierAttributeName - ); + final var explicitFetchBuilder = + currentFetchBuilderResolver().apply( identifierMapping ); + + final var fetchBuilderLegacy = + legacyFetchBuilder( identifierMapping, fetchParent, explicitFetchBuilder ); + + final var fetchPath = + new EntityIdentifierNavigablePath( + fetchParent.getNavigablePath(), + attributeName( identifierMapping ) + ); final boolean processingKeyFetches = this.processingKeyFetches; this.processingKeyFetches = true; try { - final FetchBuilder fetchBuilder; - if ( explicitFetchBuilder != null ) { - fetchBuilder = explicitFetchBuilder; - } - else if ( fetchBuilderLegacy != null ) { - fetchBuilder = fetchBuilderLegacy; - } - else { - fetchBuilder = Builders.implicitFetchBuilder( fetchPath, identifierMapping, this ); - } - - return fetchBuilder.buildFetch( - fetchParent, - fetchPath, - jdbcResultsMetadata, - this - ); + return fetchBuilder( identifierMapping, explicitFetchBuilder, fetchBuilderLegacy, fetchPath ) + .buildFetch( fetchParent, fetchPath, jdbcResultsMetadata, this ); } finally { this.processingKeyFetches = processingKeyFetches; @@ -402,9 +398,9 @@ else if ( fetchBuilderLegacy != null ) { @Override public ImmutableFetchList visitFetches(FetchParent fetchParent) { - final FetchableContainer fetchableContainer = fetchParent.getReferencedMappingContainer(); - final ImmutableFetchList.Builder fetches = new ImmutableFetchList.Builder( fetchableContainer ); - final Consumer fetchableConsumer = createFetchableConsumer( fetchParent, fetches ); + final var fetchableContainer = fetchParent.getReferencedMappingContainer(); + final var fetches = new ImmutableFetchList.Builder( fetchableContainer ); + final var fetchableConsumer = createFetchableConsumer( fetchParent, fetches ); fetchableContainer.visitKeyFetchables( fetchableConsumer, null ); fetchableContainer.visitFetchables( fetchableConsumer, null ); return fetches.build(); @@ -415,60 +411,36 @@ private Consumer createFetchableConsumer(FetchParent fetchParent, Imm if ( !fetchable.isSelectable() ) { return; } - FetchBuilder explicitFetchBuilder = fetchBuilderResolverStack.getCurrent().apply( fetchable ); - LegacyFetchBuilder fetchBuilderLegacy; - if ( explicitFetchBuilder == null ) { - fetchBuilderLegacy = legacyFetchResolver.resolve( - fromClauseAccess.findTableGroup( fetchParent.getNavigablePath() ) - .getPrimaryTableReference() - .getIdentificationVariable(), - fetchable - ); - } - else { - fetchBuilderLegacy = null; - } + FetchBuilder explicitFetchBuilder = currentFetchBuilderResolver().apply( fetchable ); + LegacyFetchBuilder fetchBuilderLegacy = + legacyFetchBuilder( fetchable, fetchParent, explicitFetchBuilder ); if ( fetchable instanceof Association association && fetchable.getMappedFetchOptions().getTiming() == FetchTiming.DELAYED ) { - final ForeignKeyDescriptor foreignKeyDescriptor = association.getForeignKeyDescriptor(); // If there are no fetch builders for this association, we only want to fetch the FK if ( explicitFetchBuilder == null && fetchBuilderLegacy == null ) { - Fetchable modelPart = (Fetchable) - foreignKeyDescriptor.getSide( association.getSideNature().inverse() ).getModelPart(); - explicitFetchBuilder = fetchBuilderResolverStack.getCurrent().apply( modelPart ); + final var modelPart = (Fetchable) + association.getForeignKeyDescriptor() + .getSide( association.getSideNature().inverse() ) + .getModelPart(); + explicitFetchBuilder = currentFetchBuilderResolver().apply( modelPart ); if ( explicitFetchBuilder == null ) { - fetchBuilderLegacy = legacyFetchResolver.resolve( - fromClauseAccess.findTableGroup( fetchParent.getNavigablePath() ) - .getPrimaryTableReference() - .getIdentificationVariable(), - fetchable - ); + fetchBuilderLegacy = + legacyFetchBuilder( fetchable, fetchParent, null ); } } } - final NavigablePath fetchPath = fetchParent.resolveNavigablePath( fetchable ); - final FetchBuilder fetchBuilder; - if ( explicitFetchBuilder != null ) { - fetchBuilder = explicitFetchBuilder; - } - else { - if ( fetchBuilderLegacy == null ) { - fetchBuilder = Builders.implicitFetchBuilder( fetchPath, fetchable, this ); - } - else { - fetchBuilder = fetchBuilderLegacy; - } - } - final Fetch fetch = fetchBuilder.buildFetch( - fetchParent, - fetchPath, - jdbcResultsMetadata, - this - ); + final var fetchPath = fetchParent.resolveNavigablePath( fetchable ); + final var fetch = + fetchBuilder( fetchable, explicitFetchBuilder, fetchBuilderLegacy, fetchPath ) + .buildFetch( fetchParent, fetchPath, jdbcResultsMetadata, this ); fetches.add( fetch ); }; } + private Function currentFetchBuilderResolver() { + return fetchBuilderResolverStack.getCurrent(); + } + @Override public boolean isResolvingCircularFetch() { return resolvingCircularFetch; diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/FromClauseAccessImpl.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/FromClauseAccessImpl.java index c43e27d4ab3f..1f7ca19f94ea 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/FromClauseAccessImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/FromClauseAccessImpl.java @@ -23,28 +23,13 @@ public class FromClauseAccessImpl implements FromClauseAccess { private Map tableGroupBySqlAlias; private Map tableGroupByPath; - public FromClauseAccessImpl() { - } - - public TableGroup getByAlias(String alias) { - final TableGroup byAlias = findByAlias( alias ); - if ( byAlias == null ) { - throw new IllegalArgumentException( "Could not resolve TableGroup by alias [" + alias + "]" ); - } - return byAlias; - } - public TableGroup findByAlias(String alias) { - if ( tableGroupBySqlAlias != null ) { - return tableGroupBySqlAlias.get( alias ); - } - - return null; + return tableGroupBySqlAlias == null ? null : tableGroupBySqlAlias.get( alias ); } @Override public @Nullable TableGroup findTableGroupByIdentificationVariable(String identificationVariable) { - for ( TableGroup tableGroup : tableGroupByPath.values() ) { + for ( var tableGroup : tableGroupByPath.values() ) { if ( tableGroup.findTableReference( identificationVariable ) != null ) { return tableGroup; } @@ -59,11 +44,8 @@ public TableGroup findTableGroupOnCurrentFromClause(NavigablePath navigablePath) @Override public TableGroup findTableGroup(NavigablePath navigablePath) { - if ( tableGroupByPath != null ) { - return tableGroupByPath.get( navigablePath ); - } + return tableGroupByPath == null ? null : tableGroupByPath.get( navigablePath ); - return null; } @Override @@ -73,11 +55,12 @@ public void registerTableGroup(NavigablePath navigablePath, TableGroup tableGrou } tableGroupByPath.put( navigablePath, tableGroup ); - if ( tableGroup.getGroupAlias() != null ) { + final String groupAlias = tableGroup.getGroupAlias(); + if ( groupAlias != null ) { if ( tableGroupBySqlAlias == null ) { tableGroupBySqlAlias = new HashMap<>(); } - tableGroupBySqlAlias.put( tableGroup.getGroupAlias(), tableGroup ); + tableGroupBySqlAlias.put( groupAlias, tableGroup ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/JdbcValuesMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/JdbcValuesMappingImpl.java index b20dcf11786a..60505b89dbd1 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/JdbcValuesMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/JdbcValuesMappingImpl.java @@ -40,6 +40,8 @@ public int getRowSize() { @Override public LockMode determineDefaultLockMode(String alias, LockMode defaultLockMode) { - return registeredLockModes == null ? defaultLockMode : registeredLockModes.getOrDefault( alias, defaultLockMode ); + return registeredLockModes == null + ? defaultLockMode + : registeredLockModes.getOrDefault( alias, defaultLockMode ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/ResultSetMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/ResultSetMappingImpl.java index c093d9d11ac7..696d56fa1bad 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/ResultSetMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/ResultSetMappingImpl.java @@ -6,10 +6,8 @@ import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.internal.util.StringHelper; import org.hibernate.loader.NonUniqueDiscoveredSqlAliasException; import org.hibernate.metamodel.mapping.BasicValuedMapping; -import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.named.NamedResultSetMappingMemento; import org.hibernate.query.results.LegacyFetchBuilder; import org.hibernate.query.results.ResultBuilder; @@ -24,7 +22,6 @@ import org.hibernate.type.BasicType; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -34,6 +31,11 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; +import static java.util.Collections.addAll; +import static java.util.Collections.emptyList; +import static java.util.Collections.unmodifiableList; +import static org.hibernate.internal.util.StringHelper.isEmpty; + /** * ResultSetMapping implementation used while building * {@linkplain org.hibernate.query.results.ResultSetMapping} references. @@ -63,7 +65,7 @@ private ResultSetMappingImpl(ResultSetMappingImpl original) { } else { final List resultBuilders = new ArrayList<>( original.resultBuilders.size() ); - for ( ResultBuilder resultBuilder : original.resultBuilders ) { + for ( var resultBuilder : original.resultBuilders ) { resultBuilders.add( resultBuilder.cacheKeyInstance() ); } this.resultBuilders = resultBuilders; @@ -72,11 +74,14 @@ private ResultSetMappingImpl(ResultSetMappingImpl original) { this.legacyFetchBuilders = null; } else { - final Map> builders = new HashMap<>( original.legacyFetchBuilders.size() ); - for ( Map.Entry> entry : original.legacyFetchBuilders.entrySet() ) { - final Map newValue = new HashMap<>( entry.getValue().size() ); - for ( Map.Entry builderEntry : entry.getValue().entrySet() ) { - newValue.put( builderEntry.getKey(), builderEntry.getValue().cacheKeyInstance() ); + final Map> builders = + new HashMap<>( original.legacyFetchBuilders.size() ); + for ( var entry : original.legacyFetchBuilders.entrySet() ) { + final Map newValue = + new HashMap<>( entry.getValue().size() ); + for ( var builderEntry : entry.getValue().entrySet() ) { + newValue.put( builderEntry.getKey(), + builderEntry.getValue().cacheKeyInstance() ); } builders.put( entry.getKey(), newValue ); } @@ -100,32 +105,27 @@ public int getNumberOfResultBuilders() { } public List getResultBuilders() { - if ( resultBuilders == null ) { - return Collections.emptyList(); - } - return Collections.unmodifiableList( resultBuilders ); + return resultBuilders == null + ? emptyList() + : unmodifiableList( resultBuilders ); } @Override public void visitResultBuilders(BiConsumer resultBuilderConsumer) { - if ( resultBuilders == null ) { - return; - } - - for ( int i = 0; i < resultBuilders.size(); i++ ) { - resultBuilderConsumer.accept( i, resultBuilders.get( i ) ); + if ( resultBuilders != null ) { + for ( int i = 0; i < resultBuilders.size(); i++ ) { + resultBuilderConsumer.accept( i, resultBuilders.get( i ) ); + } } } @Override public void visitLegacyFetchBuilders(Consumer resultBuilderConsumer) { - if ( legacyFetchBuilders == null ) { - return; - } - - for ( Map.Entry> entry : legacyFetchBuilders.entrySet() ) { - for ( LegacyFetchBuilder fetchBuilder : entry.getValue().values() ) { - resultBuilderConsumer.accept( fetchBuilder ); + if ( legacyFetchBuilders != null ) { + for ( var entry : legacyFetchBuilders.entrySet() ) { + for ( LegacyFetchBuilder fetchBuilder : entry.getValue().values() ) { + resultBuilderConsumer.accept( fetchBuilder ); + } } } } @@ -164,18 +164,14 @@ public void addLegacyFetchBuilder(LegacyFetchBuilder fetchBuilder) { @Override public void addAffectedTableNames(Set affectedTableNames, SessionFactoryImplementor sessionFactory) { - if ( StringHelper.isEmpty( mappingIdentifier ) ) { - return; - } - - final EntityPersister entityDescriptor = - sessionFactory.getMappingMetamodel() - .findEntityDescriptor( mappingIdentifier ); - if ( entityDescriptor == null ) { - return; + if ( !isEmpty( mappingIdentifier ) ) { + final var entityDescriptor = + sessionFactory.getMappingMetamodel() + .findEntityDescriptor( mappingIdentifier ); + if ( entityDescriptor != null ) { + addAll( affectedTableNames, (String[]) entityDescriptor.getQuerySpaces() ); + } } - - Collections.addAll( affectedTableNames, (String[]) entityDescriptor.getQuerySpaces() ); } @Override @@ -184,15 +180,12 @@ public JdbcValuesMapping resolve( LoadQueryInfluencers loadQueryInfluencers, SessionFactoryImplementor sessionFactory) { - final int numberOfResults; final int rowSize = jdbcResultsMetadata.getColumnCount(); - - numberOfResults = resultBuilders == null ? rowSize : resultBuilders.size(); + final int numberOfResults = resultBuilders == null ? rowSize : resultBuilders.size(); final List sqlSelections = new ArrayList<>( rowSize ); - final List> domainResults = new ArrayList<>( numberOfResults ); - final DomainResultCreationStateImpl creationState = new DomainResultCreationStateImpl( + final var creationState = new DomainResultCreationStateImpl( mappingIdentifier, jdbcResultsMetadata, legacyFetchBuilders, @@ -202,79 +195,14 @@ public JdbcValuesMapping resolve( sessionFactory ); - for ( int i = 0; i < numberOfResults; i++ ) { - final ResultBuilder resultBuilder = resultBuilders != null - ? resultBuilders.get( i ) - : null; - - final DomainResult domainResult; - if ( resultBuilder == null ) { - domainResult = makeImplicitDomainResult( - i, - sqlSelections::add, - jdbcResultsMetadata, - sessionFactory - ); - } - else { - domainResult = resultBuilder.buildResult( - jdbcResultsMetadata, - domainResults.size(), - creationState - ); - } - - if ( domainResult.containsAnyNonScalarResults() ) { - creationState.disallowPositionalSelections(); - } + final var domainResults = + collectDomainResults( jdbcResultsMetadata, sessionFactory, + numberOfResults, sqlSelections, creationState ); - domainResults.add( domainResult ); - } // We only need this check when we actually have result builders // As people should be able to just run native queries and work with tuples if ( resultBuilders != null ) { - final Set knownDuplicateAliases = new TreeSet<>( String.CASE_INSENSITIVE_ORDER ); - if ( resultBuilders.size() == 1 && domainResults.size() == 1 && domainResults.get( 0 ) instanceof EntityResult entityResult ) { - // Special case for result set mappings that just fetch a single polymorphic entity - final EntityPersister persister = entityResult.getReferencedMappingContainer().getEntityPersister(); - final boolean polymorphic = persister.isPolymorphic(); - // We only need to check for duplicate aliases if we have join fetches, - // otherwise we assume that even if there are duplicate aliases, the values are equivalent. - // If we don't do that, there is no way to fetch joined inheritance entities - if ( polymorphic && ( legacyFetchBuilders == null || legacyFetchBuilders.isEmpty() ) - && !entityResult.hasJoinFetches() ) { - final Set aliases = new TreeSet<>( String.CASE_INSENSITIVE_ORDER ); - for ( String[] columns : persister.getConstraintOrderedTableKeyColumnClosure() ) { - addColumns( aliases, knownDuplicateAliases, columns ); - } - addColumn( aliases, knownDuplicateAliases, persister.getDiscriminatorColumnName() ); - addColumn( aliases, knownDuplicateAliases, persister.getVersionColumnName() ); - for (int i = 0; i < persister.countSubclassProperties(); i++ ) { - addColumns( - aliases, - knownDuplicateAliases, - persister.getSubclassPropertyColumnNames( i ) - ); - } - } - } - final String[] aliases = new String[rowSize]; - final Map aliasHasDuplicates = new HashMap<>( rowSize ); - for ( int i = 0; i < rowSize; i++ ) { - aliasHasDuplicates.compute( - aliases[i] = jdbcResultsMetadata.resolveColumnName( i + 1 ), - (k, v) -> v == null ? Boolean.FALSE : Boolean.TRUE - ); - } - // Only check for duplicates for the selections that we actually use - for ( SqlSelection sqlSelection : sqlSelections ) { - final String alias = aliases[sqlSelection.getValuesArrayPosition()]; - if ( !knownDuplicateAliases.contains( alias ) && aliasHasDuplicates.get( alias ) == Boolean.TRUE ) { - throw new NonUniqueDiscoveredSqlAliasException( - "Encountered a duplicated sql alias [" + alias + "] during auto-discovery of a native-sql query" - ); - } - } + checkDuplicateAliases( jdbcResultsMetadata, domainResults, rowSize, sqlSelections ); } return new JdbcValuesMappingImpl( @@ -285,6 +213,108 @@ public JdbcValuesMapping resolve( ); } + private void checkDuplicateAliases( + JdbcValuesMetadata jdbcResultsMetadata, + List> domainResults, + int rowSize, + List sqlSelections) { + final Set knownDuplicateAliases = new TreeSet<>( String.CASE_INSENSITIVE_ORDER ); + if ( resultBuilders.size() == 1 && domainResults.size() == 1 + && domainResults.get( 0 ) instanceof EntityResult entityResult ) { + // Special case for result set mappings that just fetch a single polymorphic entity + final var persister = entityResult.getReferencedMappingContainer().getEntityPersister(); + final boolean polymorphic = persister.isPolymorphic(); + // We only need to check for duplicate aliases if we have join fetches, + // otherwise we assume that even if there are duplicate aliases, the values are equivalent. + // If we don't do that, there is no way to fetch joined inheritance entities + if ( polymorphic + && ( legacyFetchBuilders == null || legacyFetchBuilders.isEmpty() ) + && !entityResult.hasJoinFetches() ) { + final Set aliases = new TreeSet<>( String.CASE_INSENSITIVE_ORDER ); + for ( var columns : persister.getConstraintOrderedTableKeyColumnClosure() ) { + addColumns( aliases, knownDuplicateAliases, columns ); + } + addColumn( aliases, knownDuplicateAliases, persister.getDiscriminatorColumnName() ); + addColumn( aliases, knownDuplicateAliases, persister.getVersionColumnName() ); + for (int i = 0; i < persister.countSubclassProperties(); i++ ) { + addColumns( aliases, knownDuplicateAliases, + persister.getSubclassPropertyColumnNames( i ) ); + } + } + } + final var aliases = new String[rowSize]; + final Map aliasHasDuplicates = new HashMap<>( rowSize ); + for ( int i = 0; i < rowSize; i++ ) { + aliasHasDuplicates.compute( + aliases[i] = jdbcResultsMetadata.resolveColumnName( i + 1 ), + (k, v) -> v == null ? Boolean.FALSE : Boolean.TRUE + ); + } + // Only check for duplicates for the selections that we actually use + for ( var sqlSelection : sqlSelections ) { + final String alias = aliases[sqlSelection.getValuesArrayPosition()]; + if ( !knownDuplicateAliases.contains( alias ) + && aliasHasDuplicates.get( alias ) == Boolean.TRUE ) { + throw new NonUniqueDiscoveredSqlAliasException( + "Encountered a duplicated sql alias [" + alias + "] during auto-discovery of a native-sql query" + ); + } + } + } + + private List> collectDomainResults( + JdbcValuesMetadata jdbcResultsMetadata, + SessionFactoryImplementor sessionFactory, + int numberOfResults, + List sqlSelections, + DomainResultCreationStateImpl creationState) { + final List> domainResults = new ArrayList<>( numberOfResults ); + for ( int i = 0; i < numberOfResults; i++ ) { + final var domainResult = + buildDomainResult( + jdbcResultsMetadata, + sessionFactory, + resultBuilders == null + ? null + : resultBuilders.get( i ), + i, + sqlSelections, + domainResults, + creationState + ); + if ( domainResult.containsAnyNonScalarResults() ) { + creationState.disallowPositionalSelections(); + } + domainResults.add( domainResult ); + } + return domainResults; + } + + private DomainResult buildDomainResult( + JdbcValuesMetadata jdbcResultsMetadata, + SessionFactoryImplementor sessionFactory, + ResultBuilder resultBuilder, + int i, + List sqlSelections, + List> domainResults, + DomainResultCreationStateImpl creationState) { + if ( resultBuilder == null ) { + return makeImplicitDomainResult( + i, + sqlSelections::add, + jdbcResultsMetadata, + sessionFactory + ); + } + else { + return resultBuilder.buildResult( + jdbcResultsMetadata, + domainResults.size(), + creationState + ); + } + } + private static void addColumns(Set aliases, Set knownDuplicateAliases, String[] columns) { for ( int i = 0; i < columns.length; i++ ) { addColumn( aliases, knownDuplicateAliases, columns[i] ); @@ -309,7 +339,9 @@ private DomainResult makeImplicitDomainResult( final String name = jdbcResultsMetadata.resolveColumnName( jdbcPosition ); - final ResultSetMappingSqlSelection sqlSelection = new ResultSetMappingSqlSelection( valuesArrayPosition, (BasicValuedMapping) jdbcMapping ); + final var sqlSelection = + new ResultSetMappingSqlSelection( valuesArrayPosition, + (BasicValuedMapping) jdbcMapping ); sqlSelectionConsumer.accept( sqlSelection ); return new BasicResult<>( @@ -346,23 +378,23 @@ public int hashCode() { } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof ResultSetMappingImpl that ) ) { return false; } - - final ResultSetMappingImpl that = (ResultSetMappingImpl) o; - if ( isDynamic ) { + else if ( isDynamic ) { return that.isDynamic - && Objects.equals( mappingIdentifier, that.mappingIdentifier ) - && Objects.equals( resultBuilders, that.resultBuilders ) - && Objects.equals( legacyFetchBuilders, that.legacyFetchBuilders ); + && Objects.equals( this.mappingIdentifier, that.mappingIdentifier ) + && Objects.equals( this.resultBuilders, that.resultBuilders ) + && Objects.equals( this.legacyFetchBuilders, that.legacyFetchBuilders ); } else { - return !that.isDynamic && mappingIdentifier != null && mappingIdentifier.equals( that.mappingIdentifier ); + return !that.isDynamic + && mappingIdentifier != null + && mappingIdentifier.equals( that.mappingIdentifier ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/TableGroupImpl.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/TableGroupImpl.java index 3d66c9bf48b5..de16e794fd1c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/TableGroupImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/TableGroupImpl.java @@ -57,10 +57,9 @@ public TableReference getTableReference( NavigablePath navigablePath, String tableExpression, boolean resolve) { - if ( primaryTableReference.getTableReference( navigablePath , tableExpression, resolve ) != null ) { - return primaryTableReference; - } - return super.getTableReference( navigablePath, tableExpression, resolve ); + return primaryTableReference.getTableReference( navigablePath, tableExpression, resolve ) == null + ? super.getTableReference( navigablePath, tableExpression, resolve ) + : primaryTableReference; } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderBasicPart.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderBasicPart.java index 1d718499ce43..0ca9c312b9de 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderBasicPart.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderBasicPart.java @@ -8,15 +8,12 @@ import org.hibernate.engine.FetchTiming; import org.hibernate.metamodel.mapping.BasicValuedModelPart; import org.hibernate.metamodel.mapping.DiscriminatorMapping; -import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.query.results.FetchBuilder; import org.hibernate.query.results.FetchBuilderBasicValued; import org.hibernate.query.results.MissingSqlSelectionException; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.query.results.internal.ResultSetMappingSqlSelection; import org.hibernate.spi.NavigablePath; -import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableReference; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.FetchParent; import org.hibernate.sql.results.graph.basic.BasicFetch; @@ -73,37 +70,21 @@ public BasicFetch buildFetch( NavigablePath fetchPath, JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationState domainResultCreationState) { - final DomainResultCreationStateImpl creationStateImpl = impl( domainResultCreationState ); + final var creationStateImpl = impl( domainResultCreationState ); - final String mappedTable = referencedModelPart.getContainingTableExpression(); + final var tableReference = + creationStateImpl.getFromClauseAccess() + .getTableGroup( parent.getNavigablePath() ) + .resolveTableReference( navigablePath, referencedModelPart, + referencedModelPart.getContainingTableExpression() ); - final TableGroup tableGroup = creationStateImpl.getFromClauseAccess().getTableGroup( parent.getNavigablePath() ); - final TableReference tableReference = tableGroup.resolveTableReference( navigablePath, referencedModelPart, mappedTable ); + final int jdbcPosition = jdbcPosition( jdbcResultsMetadata, creationStateImpl ); + final String selectedAlias = + selectionAlias == null + ? jdbcResultsMetadata.resolveColumnName( jdbcPosition ) + : selectionAlias; - final String selectedAlias; - final int jdbcPosition; - if ( selectionAlias != null ) { - try { - jdbcPosition = jdbcResultsMetadata.resolveColumnPosition( selectionAlias ); - } - catch (Exception e) { - throw new MissingSqlSelectionException( - "ResultSet mapping specified selected-alias `" + selectionAlias - + "` which was not part of the ResultSet", - e - ); - } - selectedAlias = selectionAlias; - } - else { - if ( ! creationStateImpl.arePositionalSelectionsAllowed() ) { - throw new AssertionFailure( "Positional SQL selection resolution not allowed" ); - } - jdbcPosition = creationStateImpl.getNumberOfProcessedSelections() + 1; - selectedAlias = jdbcResultsMetadata.resolveColumnName( jdbcPosition ); - } - - final JdbcMapping jdbcMapping = + final var jdbcMapping = referencedModelPart instanceof DiscriminatorMapping discriminatorMapping ? discriminatorMapping.getUnderlyingJdbcMapping() : referencedModelPart.getJdbcMapping(); @@ -125,19 +106,40 @@ public BasicFetch buildFetch( ); } + private int jdbcPosition(JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationStateImpl creationStateImpl) { + if ( selectionAlias != null ) { + try { + return jdbcResultsMetadata.resolveColumnPosition( selectionAlias ); + } + catch (Exception e) { + throw new MissingSqlSelectionException( + "ResultSet mapping specified selected alias '" + selectionAlias + + "' which was not part of the ResultSet", + e + ); + } + } + else { + if ( !creationStateImpl.arePositionalSelectionsAllowed() ) { + throw new AssertionFailure( "Positional SQL selection resolution not allowed" ); + } + return creationStateImpl.getNumberOfProcessedSelections() + 1; + } + } + @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof CompleteFetchBuilderBasicPart that ) ) { return false; } - - final CompleteFetchBuilderBasicPart that = (CompleteFetchBuilderBasicPart) o; - return navigablePath.equals( that.navigablePath ) - && referencedModelPart.equals( that.referencedModelPart ) - && Objects.equals( selectionAlias, that.selectionAlias ); + else { + return navigablePath.equals( that.navigablePath ) + && referencedModelPart.equals( that.referencedModelPart ) + && Objects.equals( selectionAlias, that.selectionAlias ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderEmbeddableValuedModelPart.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderEmbeddableValuedModelPart.java index bc433191c1b8..ed0d285799a1 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderEmbeddableValuedModelPart.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderEmbeddableValuedModelPart.java @@ -11,7 +11,6 @@ import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.query.results.FetchBuilder; -import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.results.graph.DomainResultCreationState; @@ -20,6 +19,7 @@ import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; import static org.hibernate.query.results.internal.ResultsHelper.impl; +import static org.hibernate.query.results.internal.ResultsHelper.resolveSqlExpression; /** * CompleteFetchBuilder for embeddable-valued ModelParts @@ -72,11 +72,13 @@ public Fetch buildFetch( JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationState domainResultCreationState) { assert fetchPath.equals( navigablePath ); - final DomainResultCreationStateImpl creationStateImpl = impl( domainResultCreationState ); - final TableGroup tableGroup = creationStateImpl.getFromClauseAccess().getTableGroup( navigablePath.getParent() ); + final var creationStateImpl = impl( domainResultCreationState ); + final var tableGroup = + creationStateImpl.getFromClauseAccess() + .getTableGroup( navigablePath.getParent() ); modelPart.forEachSelectable( - (selectionIndex, selectableMapping) -> - sqlSelection( jdbcResultsMetadata, selectionIndex, selectableMapping, creationStateImpl, tableGroup ) + (index, selectableMapping) -> + sqlSelection( jdbcResultsMetadata, index, selectableMapping, creationStateImpl, tableGroup ) ); return parent.generateFetchableFetch( modelPart, @@ -95,7 +97,7 @@ private void sqlSelection( DomainResultCreationStateImpl creationStateImpl, TableGroup tableGroup) { creationStateImpl.resolveSqlSelection( - ResultsHelper.resolveSqlExpression( + resolveSqlExpression( creationStateImpl, jdbcResultsMetadata, tableGroup.resolveTableReference( navigablePath, modelPart, @@ -110,18 +112,18 @@ private void sqlSelection( } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !(object instanceof CompleteFetchBuilderEmbeddableValuedModelPart that ) ) { return false; } - - final CompleteFetchBuilderEmbeddableValuedModelPart that = (CompleteFetchBuilderEmbeddableValuedModelPart) o; - return navigablePath.equals( that.navigablePath ) - && modelPart.equals( that.modelPart ) - && columnAliases.equals( that.columnAliases ); + else { + return navigablePath.equals( that.navigablePath ) + && modelPart.equals( that.modelPart ) + && columnAliases.equals( that.columnAliases ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderEntityValuedModelPart.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderEntityValuedModelPart.java index d45113652fef..76562a355f29 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderEntityValuedModelPart.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteFetchBuilderEntityValuedModelPart.java @@ -9,7 +9,6 @@ import org.hibernate.engine.FetchTiming; import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.metamodel.mapping.ValuedModelPart; -import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.spi.NavigablePath; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.query.results.FetchBuilder; @@ -21,6 +20,7 @@ import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; import static org.hibernate.query.results.internal.ResultsHelper.impl; +import static org.hibernate.query.results.internal.ResultsHelper.resolveSqlExpression; /** * CompleteFetchBuilder for entity-valued ModelParts @@ -73,8 +73,10 @@ public Fetch buildFetch( JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationState domainResultCreationState) { assert fetchPath.equals( navigablePath ); - final DomainResultCreationStateImpl creationStateImpl = impl( domainResultCreationState ); - final TableGroup tableGroup = creationStateImpl.getFromClauseAccess().getTableGroup( navigablePath.getParent() ); + final var creationStateImpl = impl( domainResultCreationState ); + final var tableGroup = + creationStateImpl.getFromClauseAccess() + .getTableGroup( navigablePath.getParent() ); modelPart.forEachSelectable( (selectionIndex, selectableMapping) -> sqlSelection( jdbcResultsMetadata, selectionIndex, selectableMapping, creationStateImpl, tableGroup ) @@ -96,7 +98,7 @@ private void sqlSelection( DomainResultCreationStateImpl creationStateImpl, TableGroup tableGroup) { creationStateImpl.resolveSqlSelection( - ResultsHelper.resolveSqlExpression( + resolveSqlExpression( creationStateImpl, jdbcResultsMetadata, tableGroup.resolveTableReference( navigablePath, (ValuedModelPart) modelPart, @@ -111,18 +113,18 @@ private void sqlSelection( } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof CompleteFetchBuilderEntityValuedModelPart that ) ) { return false; } - - final CompleteFetchBuilderEntityValuedModelPart that = (CompleteFetchBuilderEntityValuedModelPart) o; - return navigablePath.equals( that.navigablePath ) - && modelPart.equals( that.modelPart ) - && columnAliases.equals( that.columnAliases ); + else { + return navigablePath.equals( that.navigablePath ) + && modelPart.equals( that.modelPart ) + && columnAliases.equals( that.columnAliases ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicModelPart.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicModelPart.java index adf33749e868..b2d091ef0666 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicModelPart.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicModelPart.java @@ -7,7 +7,6 @@ import org.hibernate.metamodel.mapping.BasicValuedModelPart; import org.hibernate.query.results.ResultBuilder; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; -import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.tree.from.TableReference; @@ -16,6 +15,7 @@ import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; import static org.hibernate.query.results.internal.ResultsHelper.impl; +import static org.hibernate.query.results.internal.ResultsHelper.resolveSqlExpression; /** * CompleteResultBuilder for basic-valued ModelParts @@ -62,9 +62,10 @@ public BasicResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { - final DomainResultCreationStateImpl creationStateImpl = impl( domainResultCreationState ); - final TableReference tableReference = tableReference( creationStateImpl ); - final SqlSelection sqlSelection = sqlSelection( jdbcResultsMetadata, creationStateImpl, tableReference ); + final var creationStateImpl = impl( domainResultCreationState ); + final var sqlSelection = + sqlSelection( jdbcResultsMetadata, creationStateImpl, + tableReference( creationStateImpl ) ); return new BasicResult<>( sqlSelection.getValuesArrayPosition(), columnAlias, @@ -80,7 +81,7 @@ private SqlSelection sqlSelection( DomainResultCreationStateImpl creationStateImpl, TableReference tableReference) { return creationStateImpl.resolveSqlSelection( - ResultsHelper.resolveSqlExpression( + resolveSqlExpression( creationStateImpl, jdbcResultsMetadata, tableReference, @@ -96,22 +97,23 @@ private SqlSelection sqlSelection( private TableReference tableReference(DomainResultCreationStateImpl creationStateImpl) { return creationStateImpl.getFromClauseAccess() .getTableGroup( navigablePath.getParent() ) - .resolveTableReference( navigablePath, modelPart, modelPart.getContainingTableExpression() ); + .resolveTableReference( navigablePath, modelPart, + modelPart.getContainingTableExpression() ); } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof CompleteResultBuilderBasicModelPart that ) ) { return false; } - - final CompleteResultBuilderBasicModelPart that = (CompleteResultBuilderBasicModelPart) o; - return navigablePath.equals( that.navigablePath ) - && modelPart.equals( that.modelPart ) - && columnAlias.equals( that.columnAlias ); + else { + return navigablePath.equals( that.navigablePath ) + && modelPart.equals( that.modelPart ) + && columnAlias.equals( that.columnAlias ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedConverted.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedConverted.java index 7ef959977102..60c3ae9876ee 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedConverted.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedConverted.java @@ -5,14 +5,11 @@ package org.hibernate.query.results.internal.complete; import jakarta.persistence.AttributeConverter; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.query.results.ResultBuilder; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.query.results.internal.ResultSetMappingSqlSelection; -import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.resource.beans.spi.ManagedBean; -import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.basic.BasicResult; @@ -24,6 +21,8 @@ import java.util.Objects; import static org.hibernate.query.results.internal.ResultsHelper.impl; +import static org.hibernate.query.results.internal.ResultsHelper.jdbcPositionToValuesArrayPosition; +import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createColumnReferenceKey; /** * ResultBuilder for scalar results defined via:
    @@ -46,7 +45,7 @@ public CompleteResultBuilderBasicValuedConverted( BasicValuedMapping underlyingMapping) { this.explicitColumnName = explicitColumnName; this.underlyingMapping = underlyingMapping; - final JavaType relationalType = + final var relationalType = underlyingMapping.getJdbcMapping() .getJavaTypeDescriptor(); this.valueConverter = new AttributeConverterBean<>( @@ -72,11 +71,12 @@ public BasicResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { - final DomainResultCreationStateImpl creationStateImpl = impl( domainResultCreationState ); + final var creationStateImpl = impl( domainResultCreationState ); final String columnName = explicitColumnName != null ? explicitColumnName - : jdbcResultsMetadata.resolveColumnName( creationStateImpl.getNumberOfProcessedSelections() + 1 ); + : jdbcResultsMetadata.resolveColumnName( + creationStateImpl.getNumberOfProcessedSelections() + 1 ); return new BasicResult<>( sqlSelection( jdbcResultsMetadata, resultPosition, creationStateImpl, columnName ) .getValuesArrayPosition(), @@ -94,38 +94,38 @@ private SqlSelection sqlSelection( int resultPosition, DomainResultCreationStateImpl creationStateImpl, String columnName) { - final SessionFactoryImplementor sessionFactory = creationStateImpl.getSessionFactory(); return creationStateImpl.resolveSqlSelection( creationStateImpl.resolveSqlExpression( - SqlExpressionResolver.createColumnReferenceKey( columnName ), + createColumnReferenceKey( columnName ), processingState -> { final int jdbcPosition = explicitColumnName != null ? jdbcResultsMetadata.resolveColumnPosition( explicitColumnName ) : resultPosition + 1; - final int valuesArrayPosition = ResultsHelper.jdbcPositionToValuesArrayPosition( jdbcPosition ); + final int valuesArrayPosition = jdbcPositionToValuesArrayPosition( jdbcPosition ); return new ResultSetMappingSqlSelection( valuesArrayPosition, underlyingMapping ); } ), valueConverter.getRelationalJavaType(), null, - sessionFactory.getTypeConfiguration() + creationStateImpl.getSessionFactory() + .getTypeConfiguration() ); } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof CompleteResultBuilderBasicValuedConverted that ) ) { return false; } - - final CompleteResultBuilderBasicValuedConverted that = (CompleteResultBuilderBasicValuedConverted) o; - return Objects.equals( explicitColumnName, that.explicitColumnName ) + else { + return Objects.equals( explicitColumnName, that.explicitColumnName ) && underlyingMapping.equals( that.underlyingMapping ) && valueConverter.equals( that.valueConverter ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedStandard.java index cc44f6368022..aca2d976e682 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedStandard.java @@ -8,8 +8,6 @@ import org.hibernate.query.results.ResultBuilder; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.query.results.internal.ResultSetMappingSqlSelection; -import org.hibernate.query.results.internal.ResultsHelper; -import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.basic.BasicResult; @@ -20,6 +18,8 @@ import java.util.Objects; import static org.hibernate.query.results.internal.ResultsHelper.impl; +import static org.hibernate.query.results.internal.ResultsHelper.jdbcPositionToValuesArrayPosition; +import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createColumnReferenceKey; /** * ResultBuilder for scalar results defined via:
      @@ -40,7 +40,6 @@ public CompleteResultBuilderBasicValuedStandard( String explicitColumnName, BasicValuedMapping explicitType, JavaType explicitJavaType) { - //noinspection unchecked assert explicitType == null || explicitType.getJdbcMapping().getJavaTypeDescriptor().getJavaTypeClass() .isAssignableFrom( explicitJavaType.getJavaTypeClass() ); @@ -65,7 +64,7 @@ public BasicResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { - final DomainResultCreationStateImpl creationStateImpl = impl( domainResultCreationState ); + final var creationStateImpl = impl( domainResultCreationState ); final int jdbcPosition = explicitColumnName != null ? jdbcResultsMetadata.resolveColumnPosition( explicitColumnName ) @@ -74,7 +73,7 @@ public BasicResult buildResult( explicitColumnName != null ? explicitColumnName : jdbcResultsMetadata.resolveColumnName( jdbcPosition ); - final SqlSelection sqlSelection = + final var sqlSelection = sqlSelection( jdbcResultsMetadata, creationStateImpl, columnName, jdbcPosition ); return new BasicResult<>( sqlSelection.getValuesArrayPosition(), @@ -90,25 +89,13 @@ private SqlSelection sqlSelection( JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationStateImpl creationStateImpl, String columnName, int jdbcPosition) { - final TypeConfiguration typeConfiguration = creationStateImpl.getCreationContext().getTypeConfiguration(); + final var typeConfiguration = creationStateImpl.getCreationContext().getTypeConfiguration(); return creationStateImpl.resolveSqlSelection( creationStateImpl.resolveSqlExpression( - SqlExpressionResolver.createColumnReferenceKey( columnName ), - processingState -> { - final BasicValuedMapping basicType; - if ( explicitType != null ) { - basicType = explicitType; - } - else { - basicType = jdbcResultsMetadata.resolveType( - jdbcPosition, - explicitJavaType, - typeConfiguration - ); - } - final int valuesArrayPosition = ResultsHelper.jdbcPositionToValuesArrayPosition( jdbcPosition ); - return new ResultSetMappingSqlSelection( valuesArrayPosition, basicType ); - } + createColumnReferenceKey( columnName ), + processingState -> + new ResultSetMappingSqlSelection( jdbcPositionToValuesArrayPosition( jdbcPosition ), + basicType( jdbcResultsMetadata, jdbcPosition, typeConfiguration ) ) ), explicitJavaType, null, @@ -116,18 +103,28 @@ private SqlSelection sqlSelection( ); } + private BasicValuedMapping basicType( + JdbcValuesMetadata jdbcResultsMetadata, + int jdbcPosition, + TypeConfiguration typeConfiguration) { + return explicitType == null + ? jdbcResultsMetadata.resolveType( jdbcPosition, explicitJavaType, typeConfiguration ) + : explicitType; + } + @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof CompleteResultBuilderBasicValuedStandard that ) ) { return false; } - final CompleteResultBuilderBasicValuedStandard that = (CompleteResultBuilderBasicValuedStandard) o; - return Objects.equals( explicitColumnName, that.explicitColumnName ) - && Objects.equals( explicitType, that.explicitType ) - && Objects.equals( explicitJavaType, that.explicitJavaType ); + else { + return Objects.equals( explicitColumnName, that.explicitColumnName ) + && Objects.equals( explicitType, that.explicitType ) + && Objects.equals( explicitJavaType, that.explicitJavaType ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderCollectionStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderCollectionStandard.java index 24ed425916d6..7c467fb96eec 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderCollectionStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderCollectionStandard.java @@ -4,7 +4,6 @@ */ package org.hibernate.query.results.internal.complete; -import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.EntityValuedModelPart; import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.metamodel.mapping.PluralAttributeMapping; @@ -12,8 +11,6 @@ import org.hibernate.query.NativeQuery; import org.hibernate.query.results.ResultBuilder; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; -import org.hibernate.query.results.internal.FromClauseAccessImpl; -import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.spi.SqlAliasBaseConstant; import org.hibernate.sql.ast.tree.from.TableGroup; @@ -24,6 +21,7 @@ import java.util.Arrays; import static org.hibernate.query.results.internal.ResultsHelper.impl; +import static org.hibernate.query.results.internal.ResultsHelper.resolveSqlExpression; /** * @author Steve Ebersole @@ -89,9 +87,9 @@ public DomainResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { - final DomainResultCreationStateImpl creationStateImpl = impl( domainResultCreationState ); - final FromClauseAccessImpl fromClauseAccess = creationStateImpl.getFromClauseAccess(); - final TableGroup rootTableGroup = pluralAttributeDescriptor.createRootTableGroup( + final var creationStateImpl = impl( domainResultCreationState ); + final var fromClauseAccess = creationStateImpl.getFromClauseAccess(); + final var rootTableGroup = pluralAttributeDescriptor.createRootTableGroup( false, navigablePath, tableAlias, @@ -139,27 +137,32 @@ private void resolveSelections( String[] columnNames, JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationStateImpl creationStateImpl) { + final var typeConfiguration = + creationStateImpl.getSessionFactory() + .getTypeConfiguration(); resolveSelections( modelPart, (selectionIndex, selectableMapping) -> creationStateImpl.resolveSqlSelection( - ResultsHelper.resolveSqlExpression( + resolveSqlExpression( creationStateImpl, jdbcResultsMetadata, - tableGroup.resolveTableReference( selectableMapping.getContainingTableExpression() ), + tableGroup.resolveTableReference( + selectableMapping.getContainingTableExpression() ), selectableMapping, columnNames[selectionIndex] ), selectableMapping.getJdbcMapping().getJdbcJavaType(), null, - creationStateImpl.getSessionFactory().getTypeConfiguration() + typeConfiguration ) ); } private static void resolveSelections(ModelPart modelPart, SelectableConsumer consumer) { if ( modelPart instanceof EntityValuedModelPart entityValuedModelPart ) { - final EntityMappingType entityMappingType = entityValuedModelPart.getEntityMappingType(); + final var entityMappingType = entityValuedModelPart.getEntityMappingType(); int index = entityMappingType.getIdentifierMapping().forEachSelectable( consumer ); - if ( entityMappingType.getDiscriminatorMapping() != null ) { - index += entityMappingType.getDiscriminatorMapping().forEachSelectable( index, consumer ); + final var discriminatorMapping = entityMappingType.getDiscriminatorMapping(); + if ( discriminatorMapping != null ) { + index += discriminatorMapping.forEachSelectable( index, consumer ); } entityMappingType.forEachSelectable( index, consumer ); } @@ -169,21 +172,21 @@ private static void resolveSelections(ModelPart modelPart, SelectableConsumer co } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof CompleteResultBuilderCollectionStandard that ) ) { return false; } - - final CompleteResultBuilderCollectionStandard that = (CompleteResultBuilderCollectionStandard) o; - return tableAlias.equals( that.tableAlias ) - && navigablePath.equals( that.navigablePath ) - && pluralAttributeDescriptor.equals( that.pluralAttributeDescriptor ) - && Arrays.equals( keyColumnNames, that.keyColumnNames ) - && Arrays.equals( indexColumnNames, that.indexColumnNames ) - && Arrays.equals( elementColumnNames, that.elementColumnNames ); + else { + return tableAlias.equals( that.tableAlias ) + && navigablePath.equals( that.navigablePath ) + && pluralAttributeDescriptor.equals( that.pluralAttributeDescriptor ) + && Arrays.equals( keyColumnNames, that.keyColumnNames ) + && Arrays.equals( indexColumnNames, that.indexColumnNames ) + && Arrays.equals( elementColumnNames, that.elementColumnNames ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderEntityJpa.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderEntityJpa.java index cd9a68f3f51e..1070adf3356c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderEntityJpa.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderEntityJpa.java @@ -10,10 +10,8 @@ import org.hibernate.query.results.FetchBuilder; import org.hibernate.query.results.FetchBuilderBasicValued; import org.hibernate.query.results.ResultBuilder; -import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.spi.NavigablePath; -import org.hibernate.sql.ast.spi.SqlAliasBase; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.Fetchable; import org.hibernate.sql.results.graph.entity.EntityResult; @@ -58,7 +56,8 @@ public CompleteResultBuilderEntityJpa( } else { // discriminated - assert !entityDescriptor.hasSubclasses() || discriminatorFetchBuilder != null; + assert !entityDescriptor.hasSubclasses() + || discriminatorFetchBuilder != null; } } @@ -83,24 +82,23 @@ public ResultBuilder cacheKeyInstance() { } @Override - public EntityResult buildResult( + public EntityResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { final String implicitAlias = entityDescriptor.getSqlAliasStem() + resultPosition; - final SqlAliasBase sqlAliasBase = - domainResultCreationState.getSqlAliasBaseManager().createSqlAliasBase( implicitAlias ); + final var sqlAliasBase = + domainResultCreationState.getSqlAliasBaseManager() + .createSqlAliasBase( implicitAlias ); - final DomainResultCreationStateImpl impl = ResultsHelper.impl( domainResultCreationState ); + final var impl = ResultsHelper.impl( domainResultCreationState ); impl.disallowPositionalSelections(); - impl.pushExplicitFetchMementoResolver( explicitFetchBuilderMap::get ); - try { // we just want it added to the registry impl.getFromClauseAccess().resolveTableGroup( navigablePath, - np -> entityDescriptor.createRootTableGroup( + path -> entityDescriptor.createRootTableGroup( // since this is only used for result set mappings, the canUseInnerJoins value is irrelevant. true, navigablePath, @@ -111,7 +109,7 @@ public EntityResult buildResult( ) ); - return new EntityResultImpl( + return new EntityResultImpl<>( navigablePath, entityDescriptor, implicitAlias, @@ -148,19 +146,19 @@ public int hashCode() { } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof CompleteResultBuilderEntityJpa that ) ) { return false; } - - final CompleteResultBuilderEntityJpa that = (CompleteResultBuilderEntityJpa) o; - return navigablePath.equals( that.navigablePath ) - && entityDescriptor.equals( that.entityDescriptor ) - && lockMode == that.lockMode - && Objects.equals( discriminatorFetchBuilder, that.discriminatorFetchBuilder ) - && explicitFetchBuilderMap.equals( that.explicitFetchBuilderMap ); + else { + return navigablePath.equals( that.navigablePath ) + && entityDescriptor.equals( that.entityDescriptor ) + && lockMode == that.lockMode + && Objects.equals( discriminatorFetchBuilder, that.discriminatorFetchBuilder ) + && explicitFetchBuilderMap.equals( that.explicitFetchBuilderMap ); + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderEntityStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderEntityStandard.java index b6d0a3be35c6..d4f4960e0505 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderEntityStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderEntityStandard.java @@ -11,7 +11,6 @@ import org.hibernate.query.results.FetchBuilder; import org.hibernate.query.results.FetchBuilderBasicValued; import org.hibernate.query.results.ResultBuilder; -import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.spi.SqlAliasBaseConstant; @@ -116,20 +115,18 @@ public ResultBuilder cacheKeyInstance() { } @Override - public EntityResult buildResult( + public EntityResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { - final DomainResultCreationStateImpl impl = ResultsHelper.impl( domainResultCreationState ); + final var impl = ResultsHelper.impl( domainResultCreationState ); impl.disallowPositionalSelections(); - impl.pushExplicitFetchMementoResolver( explicitFetchBuilderMap::get ); - try { // we just want it added to the registry impl.getFromClauseAccess().resolveTableGroup( navigablePath, - np -> entityDescriptor.createRootTableGroup( + path -> entityDescriptor.createRootTableGroup( // since this is only used for result set mappings, the canUseInnerJoins value is irrelevant. true, navigablePath, @@ -140,7 +137,7 @@ public EntityResult buildResult( ) ); - return new EntityResultImpl( + return new EntityResultImpl<>( navigablePath, entityDescriptor, tableAlias, @@ -181,15 +178,15 @@ public boolean equals(Object o) { if ( this == o ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( o instanceof CompleteResultBuilderEntityStandard that ) ) { return false; } - - final CompleteResultBuilderEntityStandard that = (CompleteResultBuilderEntityStandard) o; - return navigablePath.equals( that.navigablePath ) - && entityDescriptor.equals( that.entityDescriptor ) - && lockMode == that.lockMode - && Objects.equals( discriminatorFetchBuilder, that.discriminatorFetchBuilder ) - && explicitFetchBuilderMap.equals( that.explicitFetchBuilderMap ); + else { + return navigablePath.equals( that.navigablePath ) + && entityDescriptor.equals( that.entityDescriptor ) + && lockMode == that.lockMode + && Objects.equals( discriminatorFetchBuilder, that.discriminatorFetchBuilder ) + && explicitFetchBuilderMap.equals( that.explicitFetchBuilderMap ); + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderInstantiation.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderInstantiation.java index 431f5e802204..73df68f9526f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderInstantiation.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderInstantiation.java @@ -71,17 +71,17 @@ private List> argumentDomainResults( } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof CompleteResultBuilderInstantiation that ) ) { return false; } - - final CompleteResultBuilderInstantiation that = (CompleteResultBuilderInstantiation) o; - return javaType.equals( that.javaType ) - && argumentResultBuilders.equals( that.argumentResultBuilders ); + else { + return javaType.equals( that.javaType ) + && argumentResultBuilders.equals( that.argumentResultBuilders ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/DelayedFetchBuilderBasicPart.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/DelayedFetchBuilderBasicPart.java index 81f30c3df763..c96d76f4b8e6 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/DelayedFetchBuilderBasicPart.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/DelayedFetchBuilderBasicPart.java @@ -64,7 +64,6 @@ public BasicFetch buildFetch( null, FetchTiming.DELAYED, isEnhancedForLazyLoading, - domainResultCreationState, false, false ); @@ -76,18 +75,18 @@ public List getColumnAliases() { } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof DelayedFetchBuilderBasicPart that ) ) { return false; } - - final DelayedFetchBuilderBasicPart that = (DelayedFetchBuilderBasicPart) o; - return isEnhancedForLazyLoading == that.isEnhancedForLazyLoading - && navigablePath.equals( that.navigablePath ) - && referencedModelPart.equals( that.referencedModelPart ); + else { + return isEnhancedForLazyLoading == that.isEnhancedForLazyLoading + && navigablePath.equals( that.navigablePath ) + && referencedModelPart.equals( that.referencedModelPart ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/EntityResultImpl.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/EntityResultImpl.java index f9644544dd1b..7d761d3c0519 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/EntityResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/EntityResultImpl.java @@ -10,9 +10,7 @@ import org.hibernate.LockMode; import org.hibernate.annotations.NotFoundAction; import org.hibernate.metamodel.mapping.EntityValuedModelPart; -import org.hibernate.persister.entity.EntityPersister; import org.hibernate.spi.NavigablePath; -import org.hibernate.sql.ast.spi.SqlAstCreationState; import org.hibernate.sql.results.graph.AssemblerCreationState; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.Fetch; @@ -25,11 +23,12 @@ import org.hibernate.sql.results.graph.entity.internal.EntityAssembler; import org.hibernate.sql.results.graph.entity.internal.EntityInitializerImpl; import org.hibernate.sql.results.graph.internal.ImmutableFetchList; +import org.hibernate.type.descriptor.java.JavaType; /** * @author Steve Ebersole */ -public class EntityResultImpl implements EntityResult, InitializerProducer { +public class EntityResultImpl implements EntityResult, InitializerProducer> { private final NavigablePath navigablePath; private final EntityValuedModelPart entityValuedModelPart; @@ -46,20 +45,20 @@ public EntityResultImpl( EntityValuedModelPart entityValuedModelPart, String resultAlias, LockMode lockMode, - Function> discriminatorFetchBuilder, + Function, BasicFetch> discriminatorFetchBuilder, DomainResultCreationState creationState) { this.navigablePath = navigablePath; this.entityValuedModelPart = entityValuedModelPart; this.resultAlias = resultAlias; - final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState(); + final var sqlAstCreationState = creationState.getSqlAstCreationState(); if ( resultAlias != null ) { sqlAstCreationState.registerLockMode( resultAlias, lockMode ); } - sqlAstCreationState.getFromClauseAccess().resolveTableGroup( - navigablePath, - np -> - entityValuedModelPart.getEntityMappingType().getEntityPersister() + sqlAstCreationState.getFromClauseAccess() + .resolveTableGroup( navigablePath, + path -> entityValuedModelPart.getEntityMappingType() + .getEntityPersister() .createRootTableGroup( true, navigablePath, @@ -68,7 +67,7 @@ public EntityResultImpl( () -> p -> {}, sqlAstCreationState ) - ); + ); this.identifierFetch = creationState.visitIdentifierFetch( this ); this.discriminatorFetch = discriminatorFetchBuilder.apply( this ); @@ -120,7 +119,7 @@ public boolean containsCollectionFetches() { @Override public void collectValueIndexesToCache(BitSet valueIndexes) { - final EntityPersister entityPersister = entityValuedModelPart.getEntityMappingType().getEntityPersister(); + final var entityPersister = entityValuedModelPart.getEntityMappingType().getEntityPersister(); identifierFetch.collectValueIndexesToCache( valueIndexes ); if ( !entityPersister.useShallowQueryCacheLayout() ) { if ( discriminatorFetch != null ) { @@ -134,7 +133,12 @@ else if ( entityPersister.storeDiscriminatorInShallowQueryCacheLayout() && discr } @Override - public EntityAssembler createResultAssembler(InitializerParent parent, AssemblerCreationState creationState) { + public JavaType getResultJavaType() { + return (JavaType) EntityResult.super.getResultJavaType(); + } + + @Override + public EntityAssembler createResultAssembler(InitializerParent parent, AssemblerCreationState creationState) { return new EntityAssembler<>( getResultJavaType(), creationState.resolveInitializer( this, parent, this ) .asEntityInitializer() ); @@ -142,7 +146,7 @@ public EntityAssembler createResultAssembler(InitializerParent parent, Assembler @Override public Initializer createInitializer( - EntityResultImpl resultGraphNode, + EntityResultImpl resultGraphNode, InitializerParent parent, AssemblerCreationState creationState) { return resultGraphNode.createInitializer( parent, creationState ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/AbstractFetchBuilderContainer.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/AbstractFetchBuilderContainer.java index 2508f94d1967..4a9c1d222327 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/AbstractFetchBuilderContainer.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/AbstractFetchBuilderContainer.java @@ -7,7 +7,6 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; -import java.util.Objects; import org.hibernate.internal.util.collections.ArrayHelper; import org.hibernate.query.results.FetchBuilder; @@ -18,7 +17,7 @@ */ public abstract class AbstractFetchBuilderContainer> implements DynamicFetchBuilderContainer { - private Map fetchBuilderMap; + Map fetchBuilderMap; protected AbstractFetchBuilderContainer() { } @@ -29,7 +28,7 @@ protected AbstractFetchBuilderContainer(AbstractFetchBuilderContainer origina for ( var entry : original.fetchBuilderMap.entrySet() ) { final var fetchBuilder = entry.getValue() instanceof DynamicFetchBuilderStandard dynamicFetchBuilderStandard - ? dynamicFetchBuilderStandard.cacheKeyInstance( this ) + ? dynamicFetchBuilderStandard.cacheKeyInstance() : entry.getValue().cacheKeyInstance(); fetchBuilderMap.put( entry.getKey(), fetchBuilder ); } @@ -91,20 +90,8 @@ public void addFetchBuilder(Fetchable fetchable, FetchBuilder fetchBuilder) { } @Override - public boolean equals(Object o) { - if ( this == o ) { - return true; - } - if ( o == null || getClass() != o.getClass() ) { - return false; - } - - final var that = (AbstractFetchBuilderContainer) o; - return Objects.equals( fetchBuilderMap, that.fetchBuilderMap ); - } + public abstract boolean equals(Object object); @Override - public int hashCode() { - return fetchBuilderMap != null ? fetchBuilderMap.hashCode() : 0; - } + public abstract int hashCode(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderLegacy.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderLegacy.java index 621422ddac86..77aa7173051f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderLegacy.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderLegacy.java @@ -19,7 +19,6 @@ import org.hibernate.query.results.FetchBuilder; import org.hibernate.query.results.LegacyFetchBuilder; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; -import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.SqlAstJoinType; import org.hibernate.sql.ast.spi.SqlAliasBaseConstant; @@ -39,6 +38,7 @@ import java.util.function.BiConsumer; import static org.hibernate.query.results.internal.ResultsHelper.impl; +import static org.hibernate.query.results.internal.ResultsHelper.resolveSqlExpression; /** * @author Steve Ebersole @@ -164,9 +164,11 @@ private Map fetchBuilderMap() { return null; } else { - final Map fetchBuilderMap = new HashMap<>( this.fetchBuilderMap.size() ); + final Map fetchBuilderMap = + new HashMap<>( this.fetchBuilderMap.size() ); for ( var entry : this.fetchBuilderMap.entrySet() ) { - fetchBuilderMap.put( entry.getKey(), entry.getValue().cacheKeyInstance() ); + fetchBuilderMap.put( entry.getKey(), + entry.getValue().cacheKeyInstance() ); } return fetchBuilderMap; } @@ -182,7 +184,8 @@ public Fetch buildFetch( final var ownerTableGroup = creationState.getFromClauseAccess().findByAlias( ownerTableAlias ); final var tableGroup = tableGroup( fetchPath, ownerTableGroup, creationState ); if ( lockMode != null ) { - domainResultCreationState.getSqlAstCreationState().registerLockMode( tableAlias, lockMode ); + domainResultCreationState.getSqlAstCreationState() + .registerLockMode( tableAlias, lockMode ); } if ( columnNames != null ) { if ( fetchable instanceof EmbeddedAttributeMapping embeddedAttributeMapping ) { @@ -202,8 +205,8 @@ public Fetch buildFetch( ); } else { - final ForeignKeyDescriptor keyDescriptor = getForeignKeyDescriptor( fetchable ); if ( !columnNames.isEmpty() ) { + final var keyDescriptor = getForeignKeyDescriptor( fetchable ); keyDescriptor.forEachSelectable( (selectionIndex, selectableMapping) -> { resolveSqlSelection( columnNames.get( selectionIndex ), @@ -220,7 +223,9 @@ public Fetch buildFetch( ); } } - // We process the fetch builder such that it contains a resultBuilderEntity before calling this method in ResultSetMappingProcessor + // We process the fetch builder such that it contains a + // resultBuilderEntity before calling this method in + // ResultSetMappingProcessor if ( resultBuilderEntity != null ) { return resultBuilderEntity.buildFetch( parent, @@ -233,13 +238,7 @@ public Fetch buildFetch( } try { creationState.pushExplicitFetchMementoResolver( - fetchable -> { - if ( fetchable != null ) { - return findFetchBuilder( fetchable ); - } - return null; - } - ); + fetchable -> fetchable == null ? null : findFetchBuilder( fetchable ) ); return parent.generateFetchableFetch( fetchable, parent.resolveNavigablePath( fetchable ), @@ -305,7 +304,7 @@ private void resolveSqlSelection( DomainResultCreationState domainResultCreationState) { final var creationStateImpl = impl( domainResultCreationState ); creationStateImpl.resolveSqlSelection( - ResultsHelper.resolveSqlExpression( + resolveSqlExpression( creationStateImpl, jdbcResultsMetadata, tableReference, @@ -314,7 +313,8 @@ private void resolveSqlSelection( ), selectableMapping.getJdbcMapping().getJdbcJavaType(), null, - domainResultCreationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() + domainResultCreationState.getSqlAstCreationState() + .getCreationContext().getTypeConfiguration() ); } @@ -363,22 +363,22 @@ public void addFetchBuilder(Fetchable fetchable, FetchBuilder fetchBuilder) { } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof DynamicFetchBuilderLegacy that ) ) { return false; } - - final var that = (DynamicFetchBuilderLegacy) o; - return tableAlias.equals( that.tableAlias ) - && ownerTableAlias.equals( that.ownerTableAlias ) - && fetchable.equals( that.fetchable ) - && lockMode.equals( that.lockMode ) - && Objects.equals( columnNames, that.columnNames ) - && Objects.equals( fetchBuilderMap, that.fetchBuilderMap ) - && Objects.equals( resultBuilderEntity, that.resultBuilderEntity ); + else { + return tableAlias.equals( that.tableAlias ) + && ownerTableAlias.equals( that.ownerTableAlias ) + && fetchable.equals( that.fetchable ) + && lockMode.equals( that.lockMode ) + && Objects.equals( columnNames, that.columnNames ) + && Objects.equals( fetchBuilderMap, that.fetchBuilderMap ) + && Objects.equals( resultBuilderEntity, that.resultBuilderEntity ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderStandard.java index 19bbd820ebe1..9ee109cce23f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderStandard.java @@ -26,6 +26,8 @@ import java.util.ArrayList; import java.util.List; +import static org.hibernate.query.results.internal.ResultsHelper.resolveSqlExpression; + /** * @author Steve Ebersole @@ -48,17 +50,8 @@ private DynamicFetchBuilderStandard(Fetchable fetchable, List columnName @Override public DynamicFetchBuilderStandard cacheKeyInstance() { - return new DynamicFetchBuilderStandard( - fetchable, - List.copyOf( columnNames ) - ); - } - - public DynamicFetchBuilderStandard cacheKeyInstance(DynamicFetchBuilderContainer container) { - return new DynamicFetchBuilderStandard( - fetchable, - List.copyOf( columnNames ) - ); + return new DynamicFetchBuilderStandard( fetchable, + List.copyOf( columnNames ) ); } @Override @@ -182,7 +175,7 @@ private SelectableConsumer getSelectableConsumer( ); final String columnAlias = columnNames.get( selectionIndex ); sqlExpressionResolver.resolveSqlSelection( - ResultsHelper.resolveSqlExpression( + resolveSqlExpression( creationStateImpl, jdbcResultsMetadata, tableReference, @@ -191,7 +184,8 @@ private SelectableConsumer getSelectableConsumer( ), selectableMapping.getJdbcMapping().getJdbcJavaType(), null, - domainResultCreationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() + domainResultCreationState.getSqlAstCreationState() + .getCreationContext().getTypeConfiguration() ); }; } @@ -215,16 +209,16 @@ public int hashCode() { } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof DynamicFetchBuilderStandard that ) ) { return false; } - - final var that = (DynamicFetchBuilderStandard) o; - return fetchable.equals( that.fetchable ) - && columnNames.equals( that.columnNames ); + else { + return fetchable.equals( that.fetchable ) + && columnNames.equals( that.columnNames ); + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderAttribute.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderAttribute.java index 8fe16e80133b..c8c6a475f1b4 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderAttribute.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderAttribute.java @@ -9,7 +9,6 @@ import org.hibernate.query.NativeQuery; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.query.results.internal.ResultSetMappingSqlSelection; -import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResultCreationState; @@ -20,6 +19,7 @@ import static org.hibernate.query.results.internal.ResultsHelper.impl; import static org.hibernate.query.results.internal.ResultsHelper.jdbcPositionToValuesArrayPosition; +import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createColumnReferenceKey; /** * DynamicResultBuilder based on a named mapped attribute @@ -77,7 +77,8 @@ public DomainResult buildResult( int resultPosition, DomainResultCreationState domainResultCreationState) { final var sqlSelection = - sqlSelection( jdbcResultsMetadata, domainResultCreationState, impl( domainResultCreationState ) ); + sqlSelection( jdbcResultsMetadata, domainResultCreationState, + impl( domainResultCreationState ) ); return new BasicResult<>( sqlSelection.getValuesArrayPosition(), columnAlias, @@ -94,7 +95,7 @@ private SqlSelection sqlSelection( DomainResultCreationStateImpl domainResultCreationStateImpl) { return domainResultCreationStateImpl.resolveSqlSelection( domainResultCreationStateImpl.resolveSqlExpression( - SqlExpressionResolver.createColumnReferenceKey( columnAlias ), + createColumnReferenceKey( columnAlias ), processingState -> { final int jdbcPosition = jdbcResultsMetadata.resolveColumnPosition( columnAlias ); final int valuesArrayPosition = jdbcPositionToValuesArrayPosition( jdbcPosition ); @@ -108,19 +109,19 @@ private SqlSelection sqlSelection( } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof DynamicResultBuilderAttribute that) ) { return false; } - - final var that = (DynamicResultBuilderAttribute) o; - return attributeMapping.equals( that.attributeMapping ) - && columnAlias.equals( that.columnAlias ) - && entityName.equals( that.entityName ) - && attributePath.equals( that.attributePath ); + else { + return attributeMapping.equals( that.attributeMapping ) + && columnAlias.equals( that.columnAlias ) + && entityName.equals( that.entityName ) + && attributePath.equals( that.attributePath ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicConverted.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicConverted.java index 7b80ff81fcf7..d6e4af149688 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicConverted.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicConverted.java @@ -8,9 +8,7 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.query.results.internal.ResultSetMappingSqlSelection; -import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.resource.beans.spi.ProvidedInstanceManagedBeanImpl; -import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.basic.BasicResult; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; @@ -20,6 +18,9 @@ import java.util.Objects; +import static org.hibernate.query.results.internal.ResultsHelper.jdbcPositionToValuesArrayPosition; +import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createColumnReferenceKey; + /** * A ResultBuilder for explicitly converted scalar results * @@ -89,7 +90,7 @@ public BasicResult buildResult( : jdbcResultsMetadata.resolveColumnName( resultPosition + 1 ); final var sqlSelection = sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlExpression( - SqlExpressionResolver.createColumnReferenceKey( columnName ), + createColumnReferenceKey( columnName ), state -> resultSetMappingSqlSelection( jdbcResultsMetadata, resultPosition, typeConfiguration ) ), basicValueConverter.getRelationalJavaType(), @@ -109,7 +110,9 @@ public BasicResult buildResult( } private ResultSetMappingSqlSelection resultSetMappingSqlSelection( - JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, TypeConfiguration typeConfiguration) { + JdbcValuesMetadata jdbcResultsMetadata, + int resultPosition, + TypeConfiguration typeConfiguration) { final int jdbcPosition = columnAlias != null ? jdbcResultsMetadata.resolveColumnPosition( columnAlias ) @@ -119,23 +122,24 @@ private ResultSetMappingSqlSelection resultSetMappingSqlSelection( basicValueConverter.getRelationalJavaType(), typeConfiguration ); - final int valuesArrayPosition = ResultsHelper.jdbcPositionToValuesArrayPosition( jdbcPosition ); - return new ResultSetMappingSqlSelection( valuesArrayPosition, (BasicValuedMapping) basicType ); + return new ResultSetMappingSqlSelection( + jdbcPositionToValuesArrayPosition( jdbcPosition ), + (BasicValuedMapping) basicType + ); } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof DynamicResultBuilderBasicConverted that ) ) { return false; } - - final var that = (DynamicResultBuilderBasicConverted) o; - - return Objects.equals( columnAlias, that.columnAlias ) - && basicValueConverter.equals( that.basicValueConverter ); + else { + return Objects.equals( columnAlias, that.columnAlias ) + && basicValueConverter.equals( that.basicValueConverter ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicStandard.java index 6f7d44c6c537..3aa75be75961 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicStandard.java @@ -7,8 +7,6 @@ import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.query.NativeQuery; import org.hibernate.query.results.internal.ResultSetMappingSqlSelection; -import org.hibernate.query.results.internal.ResultsHelper; -import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.basic.BasicResult; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; @@ -19,6 +17,9 @@ import java.util.Objects; +import static org.hibernate.query.results.internal.ResultsHelper.jdbcPositionToValuesArrayPosition; +import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createColumnReferenceKey; + /** * Standard DynamicResultBuilder for basic values. * @@ -119,10 +120,9 @@ public BasicResult buildResult( final var typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); final var sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); - final var expression = sqlExpressionResolver.resolveSqlExpression( - SqlExpressionResolver.createColumnReferenceKey( columnName ), - state -> resultSetMappingSqlSelection( jdbcResultsMetadata, typeConfiguration ) - ); + final var expression = + sqlExpressionResolver.resolveSqlExpression( createColumnReferenceKey( columnName ), + state -> resultSetMappingSqlSelection( jdbcResultsMetadata, typeConfiguration ) ); final JavaType javaType; final JavaType jdbcJavaType; @@ -165,29 +165,31 @@ private ResultSetMappingSqlSelection resultSetMappingSqlSelection( columnPosition > 0 ? columnPosition : jdbcResultsMetadata.resolveColumnPosition( columnName ); - final int valuesArrayPosition = ResultsHelper.jdbcPositionToValuesArrayPosition( jdbcPosition ); final var basicType = explicitType != null ? explicitType : jdbcResultsMetadata.resolveType( jdbcPosition, explicitJavaType, typeConfiguration ); - return new ResultSetMappingSqlSelection( valuesArrayPosition, (BasicValuedMapping) basicType ); + return new ResultSetMappingSqlSelection( + jdbcPositionToValuesArrayPosition( jdbcPosition ), + (BasicValuedMapping) basicType + ); } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof DynamicResultBuilderBasicStandard that ) ) { return false; } - - final var that = (DynamicResultBuilderBasicStandard) o; - return columnPosition == that.columnPosition - && columnName.equals( that.columnName ) - && resultAlias.equals( that.resultAlias ) - && Objects.equals( explicitType, that.explicitType ) - && Objects.equals( explicitJavaType, that.explicitJavaType ); + else { + return columnPosition == that.columnPosition + && columnName.equals( that.columnName ) + && resultAlias.equals( that.resultAlias ) + && Objects.equals( explicitType, that.explicitType ) + && Objects.equals( explicitJavaType, that.explicitJavaType ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntity.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntity.java index 4151660662ff..3e1ec5b232fb 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntity.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntity.java @@ -14,7 +14,7 @@ */ public interface DynamicResultBuilderEntity extends DynamicResultBuilder, ResultBuilderEntityValued { @Override - EntityResult buildResult( + EntityResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState); diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityCalculated.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityCalculated.java index a8a800a3f2a5..feb4613770a7 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityCalculated.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityCalculated.java @@ -99,7 +99,7 @@ public DynamicResultBuilderEntityCalculated cacheKeyInstance() { } @Override - public EntityResult buildResult( + public EntityResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { @@ -119,7 +119,7 @@ public EntityResult buildResult( domainResultCreationState.getSqlAstCreationState().registerLockMode( tableAlias, explicitLockMode ); } - return (EntityResult) entityMapping.createDomainResult( + return (EntityResult) entityMapping.createDomainResult( navigablePath, tableGroup, tableAlias, @@ -128,19 +128,19 @@ public EntityResult buildResult( } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof DynamicResultBuilderEntityCalculated that ) ) { return false; } - - final var that = (DynamicResultBuilderEntityCalculated) o; - return navigablePath.equals( that.navigablePath ) - && entityMapping.equals( that.entityMapping ) - && tableAlias.equals( that.tableAlias ) - && explicitLockMode == that.explicitLockMode; + else { + return navigablePath.equals( that.navigablePath ) + && entityMapping.equals( that.entityMapping ) + && tableAlias.equals( that.tableAlias ) + && explicitLockMode == that.explicitLockMode; + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityStandard.java index 568c3c99f39b..65b80f7c4fff 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityStandard.java @@ -4,6 +4,7 @@ */ package org.hibernate.query.results.internal.dynamic; +import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.AssertionFailure; import org.hibernate.LockMode; import org.hibernate.engine.FetchTiming; @@ -16,7 +17,6 @@ import org.hibernate.metamodel.mapping.internal.ManyToManyCollectionPart; import org.hibernate.query.NativeQuery; import org.hibernate.query.results.FetchBuilder; -import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.query.results.internal.complete.CompleteFetchBuilder; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.spi.SqlAliasBaseConstant; @@ -30,12 +30,13 @@ import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.function.Function; +import static java.util.Collections.addAll; import static org.hibernate.query.results.internal.ResultsHelper.impl; +import static org.hibernate.query.results.internal.ResultsHelper.resolveSqlExpression; /** * @author Steve Ebersole @@ -108,7 +109,7 @@ public NativeQuery.RootReturn addIdColumnAliases(String... aliases) { if ( idColumnNames == null ) { idColumnNames = new ArrayList<>( aliases.length ); } - Collections.addAll( idColumnNames, aliases ); + addAll( idColumnNames, aliases ); return this; } @@ -128,12 +129,12 @@ public DynamicResultBuilderEntityStandard cacheKeyInstance() { } @Override - public EntityResult buildResult( + public EntityResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { return buildResultOrFetch( - (tableGroup) -> (EntityResult) entityMapping.createDomainResult( + (tableGroup) -> (EntityResult) entityMapping.createDomainResult( navigablePath, tableGroup, tableAlias, @@ -182,11 +183,12 @@ private T buildResultOrFetch( collectionTableGroup = null; elementNavigablePath = navigablePath; } - final TableGroup tableGroup = fromClauseAccess.resolveTableGroup( + final var tableGroup = fromClauseAccess.resolveTableGroup( elementNavigablePath, - np -> { + path -> { if ( lockMode != null ) { - domainResultCreationState.getSqlAstCreationState().registerLockMode( tableAlias, lockMode ); + domainResultCreationState.getSqlAstCreationState() + .registerLockMode( tableAlias, lockMode ); } return entityMapping.createRootTableGroup( true, @@ -199,17 +201,8 @@ private T buildResultOrFetch( } ); final var tableReference = tableGroup.getPrimaryTableReference(); - final List keyColumnAliases; final var idFetchBuilder = findIdFetchBuilder(); - if ( idColumnNames != null ) { - keyColumnAliases = idColumnNames; - } - else if ( idFetchBuilder != null ) { - keyColumnAliases = ( (DynamicFetchBuilder) idFetchBuilder ).getColumnAliases(); - } - else { - keyColumnAliases = null; - } + final var keyColumnAliases = getKeyColumnAliases( idFetchBuilder ); if ( keyColumnAliases != null ) { final ModelPart keyPart; final TableGroup keyTableGroup; @@ -221,30 +214,22 @@ else if ( idFetchBuilder != null ) { else { // In here, we know that the idColumnNames refer to the columns of the join table, // so we also need to resolve selections for the element identifier columns - final var elementDescriptor = (ManyToManyCollectionPart) pluralAttributeMapping.getElementDescriptor(); + final var elementDescriptor = + (ManyToManyCollectionPart) + pluralAttributeMapping.getElementDescriptor(); keyPart = elementDescriptor.getForeignKeyDescriptor().getKeyPart(); keyTableGroup = collectionTableGroup; - final List idColumnAliases; - if ( idFetchBuilder instanceof DynamicFetchBuilder dynamicFetchBuilder ) { - idColumnAliases = dynamicFetchBuilder.getColumnAliases(); - } - else if ( idFetchBuilder instanceof CompleteFetchBuilder completeFetchBuilder ) { - idColumnAliases = completeFetchBuilder.getColumnAliases(); - } - else { - throw new AssertionFailure( "Unexpected fetch builder" ); - } - - entityMapping - .getIdentifierMapping() - .forEachSelectable( (selectionIndex, selectableMapping) -> resolveSqlSelection( - idColumnAliases.get( selectionIndex ), - tableReference, - selectableMapping, - jdbcResultsMetadata, - domainResultCreationState - ) - ); + final var idColumnAliases = getIdColumnAliases( idFetchBuilder ); + entityMapping.getIdentifierMapping() + .forEachSelectable( (selectionIndex, selectableMapping) -> + resolveSqlSelection( + idColumnAliases.get( selectionIndex ), + tableReference, + selectableMapping, + jdbcResultsMetadata, + domainResultCreationState + ) + ); } } else { @@ -254,7 +239,8 @@ else if ( idFetchBuilder instanceof CompleteFetchBuilder completeFetchBuilder ) keyPart.forEachSelectable( (selectionIndex, selectableMapping) -> resolveSqlSelection( keyColumnAliases.get( selectionIndex ), - keyTableGroup.resolveTableReference( selectableMapping.getContainingTableExpression() ), + keyTableGroup.resolveTableReference( + selectableMapping.getContainingTableExpression() ), selectableMapping, jdbcResultsMetadata, domainResultCreationState @@ -273,13 +259,7 @@ else if ( idFetchBuilder instanceof CompleteFetchBuilder completeFetchBuilder ) try { creationState.pushExplicitFetchMementoResolver( - f -> { - if ( f != null ) { - return findFetchBuilder( f ); - } - return null; - } - ); + f -> f == null ? null : findFetchBuilder( f ) ); return resultOrFetchBuilder.apply( tableGroup ); } finally { @@ -287,10 +267,34 @@ else if ( idFetchBuilder instanceof CompleteFetchBuilder completeFetchBuilder ) } } + private static List getIdColumnAliases(FetchBuilder idFetchBuilder) { + if ( idFetchBuilder instanceof DynamicFetchBuilder dynamicFetchBuilder ) { + return dynamicFetchBuilder.getColumnAliases(); + } + else if ( idFetchBuilder instanceof CompleteFetchBuilder completeFetchBuilder ) { + return completeFetchBuilder.getColumnAliases(); + } + else { + throw new AssertionFailure( "Unexpected fetch builder" ); + } + } + + private @Nullable List getKeyColumnAliases(FetchBuilder idFetchBuilder) { + if ( idColumnNames != null ) { + return idColumnNames; + } + else if ( idFetchBuilder != null ) { + return ( (DynamicFetchBuilder) idFetchBuilder).getColumnAliases(); + } + else { + return null; + } + } + private static void resolveDiscriminatorSqlSelection(String columnAlias, TableReference tableReference, EntityDiscriminatorMapping discriminatorMapping, JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationState domainResultCreationState) { final var creationStateImpl = impl( domainResultCreationState ); creationStateImpl.resolveSqlSelection( - ResultsHelper.resolveSqlExpression( + resolveSqlExpression( creationStateImpl, jdbcResultsMetadata, tableReference, @@ -316,7 +320,7 @@ private void resolveSqlSelection( DomainResultCreationState domainResultCreationState) { final var creationStateImpl = impl( domainResultCreationState ); creationStateImpl.resolveSqlSelection( - ResultsHelper.resolveSqlExpression( + resolveSqlExpression( creationStateImpl, jdbcResultsMetadata, tableReference, @@ -356,7 +360,7 @@ public NativeQuery.ReturnProperty addProperty(String propertyName) { @Override public int hashCode() { - int result = super.hashCode(); + int result = fetchBuilderMap == null ? 0 : fetchBuilderMap.hashCode(); result = 31 * result + navigablePath.hashCode(); result = 31 * result + entityMapping.hashCode(); result = 31 * result + tableAlias.hashCode(); @@ -367,21 +371,21 @@ public int hashCode() { } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + if ( !( object instanceof DynamicResultBuilderEntityStandard that ) ) { return false; } - - final var that = (DynamicResultBuilderEntityStandard) o; - return navigablePath.equals( that.navigablePath ) - && entityMapping.equals( that.entityMapping ) - && tableAlias.equals( that.tableAlias ) - && lockMode == that.lockMode - && Objects.equals( idColumnNames, that.idColumnNames ) - && Objects.equals( discriminatorColumnName, that.discriminatorColumnName ) - && super.equals( o ); + else { + return navigablePath.equals( that.navigablePath ) + && entityMapping.equals( that.entityMapping ) + && tableAlias.equals( that.tableAlias ) + && lockMode == that.lockMode + && Objects.equals( idColumnNames, that.idColumnNames ) + && Objects.equals( discriminatorColumnName, that.discriminatorColumnName ) + && Objects.equals( fetchBuilderMap, that.fetchBuilderMap ); + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderInstantiation.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderInstantiation.java index 4285e43a0618..402d4ddcd2b6 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderInstantiation.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderInstantiation.java @@ -34,17 +34,17 @@ public InstantiationArgument(DynamicResultBuilder argumentBuilder, String result } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + if ( !( object instanceof InstantiationArgument that ) ) { return false; } - - final var that = (InstantiationArgument) o; - return argumentBuilder.equals( that.argumentBuilder ) - && resultAlias.equals( that.resultAlias ); + else { + return argumentBuilder.equals( that.argumentBuilder ) + && resultAlias.equals( that.resultAlias ); + } } @Override @@ -65,7 +65,8 @@ public DynamicResultBuilderInstantiation(JavaType javaType) { private DynamicResultBuilderInstantiation(DynamicResultBuilderInstantiation original) { this.javaType = original.javaType; - final List arguments = new ArrayList<>( original.argumentResultBuilders.size() ); + final List arguments = + new ArrayList<>( original.argumentResultBuilders.size() ); for ( var arg : original.argumentResultBuilders ) { arguments.add( new InstantiationArgument( arg.argumentBuilder.cacheKeyInstance(), arg.resultAlias ) ); } @@ -97,7 +98,8 @@ public DomainResult buildResult( throw new IllegalStateException( "DynamicResultBuilderInstantiation defined no arguments" ); } - final List> argumentDomainResults = new ArrayList<>( argumentResultBuilders.size() ); + final List> argumentDomainResults = + new ArrayList<>( argumentResultBuilders.size() ); for ( int i = 0; i < argumentResultBuilders.size(); i++ ) { argumentDomainResults.add( new ArgumentDomainResult<>( argumentResultBuilders.get( i ) @@ -114,17 +116,17 @@ public DomainResult buildResult( } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof DynamicResultBuilderInstantiation that ) ) { return false; } - - final var that = (DynamicResultBuilderInstantiation) o; - return javaType.equals( that.javaType ) - && argumentResultBuilders.equals( that.argumentResultBuilders ); + else { + return javaType.equals( that.javaType ) + && argumentResultBuilders.equals( that.argumentResultBuilders ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitAttributeFetchBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitAttributeFetchBuilder.java index a1b31919fd07..56bac498d5e4 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitAttributeFetchBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitAttributeFetchBuilder.java @@ -51,17 +51,17 @@ public Fetch buildFetch( } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof ImplicitAttributeFetchBuilder that ) ) { return false; } - - final ImplicitAttributeFetchBuilder that = (ImplicitAttributeFetchBuilder) o; - return navigablePath.equals( that.navigablePath ) - && attributeMapping.equals( that.attributeMapping ); + else { + return navigablePath.equals( that.navigablePath ) + && attributeMapping.equals( that.attributeMapping ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderBasic.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderBasic.java index 897c0a1c0c33..bbc96e3aca39 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderBasic.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderBasic.java @@ -8,11 +8,9 @@ import org.hibernate.metamodel.mapping.BasicValuedModelPart; import org.hibernate.query.results.FetchBuilder; import org.hibernate.query.results.FetchBuilderBasicValued; -import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.query.results.internal.ResultsHelper; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.spi.SqlSelection; -import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.FetchParent; import org.hibernate.sql.results.graph.Fetchable; @@ -22,6 +20,7 @@ import java.util.function.BiConsumer; import static org.hibernate.query.results.internal.ResultsHelper.impl; +import static org.hibernate.query.results.internal.ResultsHelper.resolveSqlExpression; /** * @author Steve Ebersole @@ -66,7 +65,7 @@ public BasicFetch buildFetch( ); } - final SqlSelection sqlSelection = + final var sqlSelection = sqlSelection( parent, fetchPath, jdbcResultsMetadata, domainResultCreationState ); return new BasicFetch<>( sqlSelection.getValuesArrayPosition(), @@ -74,7 +73,6 @@ public BasicFetch buildFetch( fetchPath, fetchable, FetchTiming.IMMEDIATE, - domainResultCreationState, !sqlSelection.isVirtual() ); } @@ -84,12 +82,12 @@ private SqlSelection sqlSelection( NavigablePath fetchPath, JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationState domainResultCreationState) { - final DomainResultCreationStateImpl creationStateImpl = ResultsHelper.impl( domainResultCreationState ); - final TableGroup parentTableGroup = + final var creationStateImpl = ResultsHelper.impl( domainResultCreationState ); + final var parentTableGroup = creationStateImpl.getFromClauseAccess() .getTableGroup( parent.getNavigablePath() ); return creationStateImpl.resolveSqlSelection( - ResultsHelper.resolveSqlExpression( + resolveSqlExpression( creationStateImpl, jdbcResultsMetadata, parentTableGroup.resolveTableReference( fetchPath, fetchable, @@ -113,17 +111,17 @@ public String toString() { } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof ImplicitFetchBuilderBasic that ) ) { return false; } - - final ImplicitFetchBuilderBasic that = (ImplicitFetchBuilderBasic) o; - return fetchPath.equals( that.fetchPath ) - && fetchable.equals( that.fetchable ); + else { + return fetchPath.equals( that.fetchPath ) + && fetchable.equals( that.fetchable ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderDiscriminatedAssociation.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderDiscriminatedAssociation.java index 88e4e30957a7..7a76541aade3 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderDiscriminatedAssociation.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderDiscriminatedAssociation.java @@ -10,8 +10,6 @@ import org.hibernate.query.results.FetchBuilder; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.SqlAstJoinType; -import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableGroupJoin; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.Fetch; import org.hibernate.sql.results.graph.FetchParent; @@ -57,10 +55,10 @@ private void tableGroup(FetchParent parent, NavigablePath fetchPath, DomainResul creationStateImpl.getFromClauseAccess().resolveTableGroup( fetchPath, navigablePath -> { - final TableGroup parentTableGroup = + final var parentTableGroup = creationStateImpl.getFromClauseAccess() .getTableGroup( parent.getNavigablePath() ); - final TableGroupJoin tableGroupJoin = fetchable.createTableGroupJoin( + final var tableGroupJoin = fetchable.createTableGroupJoin( fetchPath, parentTableGroup, null, @@ -77,17 +75,17 @@ private void tableGroup(FetchParent parent, NavigablePath fetchPath, DomainResul } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof ImplicitFetchBuilderDiscriminatedAssociation that ) ) { return false; } - - final ImplicitFetchBuilderDiscriminatedAssociation that = (ImplicitFetchBuilderDiscriminatedAssociation) o; - return fetchPath.equals( that.fetchPath ) - && fetchable.equals( that.fetchable ); + else { + return fetchPath.equals( that.fetchPath ) + && fetchable.equals( that.fetchable ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEmbeddable.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEmbeddable.java index 39d362249fc0..756bd9771301 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEmbeddable.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEmbeddable.java @@ -9,8 +9,6 @@ import org.hibernate.query.results.internal.DomainResultCreationStateImpl; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.SqlAstJoinType; -import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableGroupJoin; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.Fetch; import org.hibernate.sql.results.graph.FetchParent; @@ -21,7 +19,6 @@ import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; -import java.util.function.Function; import static java.util.Collections.emptyMap; import static org.hibernate.internal.util.collections.CollectionHelper.linkedMapOfSize; @@ -49,13 +46,13 @@ private static Map fetchBuilderMap( NavigablePath fetchPath, EmbeddableValuedFetchable fetchable, DomainResultCreationStateImpl creationStateImpl) { - final Function fetchBuilderResolver = + final var fetchBuilderResolver = creationStateImpl.getCurrentExplicitFetchMementoResolver(); final int size = fetchable.getNumberOfFetchables(); final Map fetchBuilders = linkedMapOfSize( size ); for ( int i = 0; i < size; i++ ) { - final Fetchable subFetchable = fetchable.getFetchable( i ); - final FetchBuilder explicitFetchBuilder = fetchBuilderResolver.apply( subFetchable ); + final var subFetchable = fetchable.getFetchable( i ); + final var explicitFetchBuilder = fetchBuilderResolver.apply( subFetchable ); fetchBuilders.put( subFetchable, explicitFetchBuilder == null ? implicitFetchBuilder( fetchPath, subFetchable, creationStateImpl ) @@ -72,7 +69,7 @@ private ImplicitFetchBuilderEmbeddable(ImplicitFetchBuilderEmbeddable original) } else { fetchBuilders = new HashMap<>( original.fetchBuilders.size() ); - for ( Map.Entry entry : original.fetchBuilders.entrySet() ) { + for ( var entry : original.fetchBuilders.entrySet() ) { fetchBuilders.put( entry.getKey(), entry.getValue().cacheKeyInstance() ); } } @@ -89,7 +86,7 @@ public Fetch buildFetch( NavigablePath fetchPath, JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationState creationState) { - final DomainResultCreationStateImpl creationStateImpl = impl( creationState ); + final var creationStateImpl = impl( creationState ); // make sure the TableGroup is available tableGroup( parent, fetchPath, creationStateImpl ); @@ -119,10 +116,10 @@ private void tableGroup(FetchParent parent, NavigablePath fetchPath, DomainResul creationStateImpl.getFromClauseAccess().resolveTableGroup( fetchPath, navigablePath -> { - final TableGroup parentTableGroup = + final var parentTableGroup = creationStateImpl.getFromClauseAccess() .getTableGroup( parent.getNavigablePath() ); - final TableGroupJoin tableGroupJoin = fetchable.createTableGroupJoin( + final var tableGroupJoin = fetchable.createTableGroupJoin( fetchPath, parentTableGroup, null, @@ -139,18 +136,18 @@ private void tableGroup(FetchParent parent, NavigablePath fetchPath, DomainResul } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof ImplicitFetchBuilderEmbeddable that ) ) { return false; } - - final ImplicitFetchBuilderEmbeddable that = (ImplicitFetchBuilderEmbeddable) o; - return fetchPath.equals( that.fetchPath ) - && fetchable.equals( that.fetchable ) - && fetchBuilders.equals( that.fetchBuilders ); + else { + return fetchPath.equals( that.fetchPath ) + && fetchable.equals( that.fetchable ) + && fetchBuilders.equals( that.fetchBuilders ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEntity.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEntity.java index e0134e0290bc..51ffe474b1b0 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEntity.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEntity.java @@ -5,7 +5,6 @@ package org.hibernate.query.results.internal.implicit; import org.hibernate.metamodel.mapping.EmbeddableMappingType; -import org.hibernate.metamodel.mapping.ForeignKeyDescriptor; import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping; import org.hibernate.query.results.internal.Builders; import org.hibernate.query.results.FetchBuilder; @@ -42,11 +41,10 @@ public ImplicitFetchBuilderEntity( DomainResultCreationState creationState) { this.fetchPath = fetchPath; this.fetchable = fetchable; - final DomainResultCreationStateImpl creationStateImpl = impl( creationState ); - final Function fetchBuilderResolver = creationStateImpl.getCurrentExplicitFetchMementoResolver(); - final ForeignKeyDescriptor foreignKeyDescriptor = fetchable.getForeignKeyDescriptor(); + final var creationStateImpl = impl( creationState ); + final var fetchBuilderResolver = creationStateImpl.getCurrentExplicitFetchMementoResolver(); + final var foreignKeyDescriptor = fetchable.getForeignKeyDescriptor(); final String associationKeyPropertyName; - final NavigablePath associationKeyFetchPath; final Fetchable associationKey; if ( fetchable.getReferencedPropertyName() == null ) { associationKeyPropertyName = fetchable.getEntityMappingType().getIdentifierMapping().getPartName(); @@ -59,8 +57,7 @@ public ImplicitFetchBuilderEntity( } associationKey = (Fetchable) fetchable.findSubPart( keyName ); } - final FetchBuilder explicitAssociationKeyFetchBuilder = - fetchBuilderResolver.apply( fetchable); + final var explicitAssociationKeyFetchBuilder = fetchBuilderResolver.apply( fetchable); if ( explicitAssociationKeyFetchBuilder == null ) { if ( foreignKeyDescriptor.getPartMappingType() instanceof EmbeddableMappingType embeddableType ) { fetchBuilders = fetchBuilderMap( @@ -87,8 +84,8 @@ private static Map fetchBuilderMap( final int size = embeddableValuedModelPart.getNumberOfFetchables(); final Map fetchBuilders = linkedMapOfSize( size ); for ( int i = 0; i < size; i++ ) { - final Fetchable subFetchable = embeddableValuedModelPart.getFetchable( i ); - final FetchBuilder explicitFetchBuilder = fetchBuilderResolver.apply( subFetchable ); + final var subFetchable = embeddableValuedModelPart.getFetchable( i ); + final var explicitFetchBuilder = fetchBuilderResolver.apply( subFetchable ); fetchBuilders.put( subFetchable, explicitFetchBuilder == null ? Builders.implicitFetchBuilder( fetchPath, subFetchable, creationStateImpl ) @@ -105,7 +102,7 @@ private ImplicitFetchBuilderEntity(ImplicitFetchBuilderEntity original) { } else { fetchBuilders = new HashMap<>( original.fetchBuilders.size() ); - for ( Map.Entry entry : original.fetchBuilders.entrySet() ) { + for ( var entry : original.fetchBuilders.entrySet() ) { fetchBuilders.put( entry.getKey(), entry.getValue().cacheKeyInstance() ); } } @@ -134,22 +131,22 @@ public Fetch buildFetch( @Override public void visitFetchBuilders(BiConsumer consumer) { - fetchBuilders.forEach( (k, v) -> consumer.accept( k, v ) ); + fetchBuilders.forEach( consumer ); } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof ImplicitFetchBuilderEntity that ) ) { return false; } - - final ImplicitFetchBuilderEntity that = (ImplicitFetchBuilderEntity) o; - return fetchPath.equals( that.fetchPath ) - && fetchable.equals( that.fetchable ) - && fetchBuilders.equals( that.fetchBuilders ); + else { + return fetchPath.equals( that.fetchPath ) + && fetchable.equals( that.fetchable ) + && fetchBuilders.equals( that.fetchBuilders ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEntityPart.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEntityPart.java index d4834dfead00..df8f6984bdf2 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEntityPart.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderEntityPart.java @@ -48,17 +48,17 @@ public Fetch buildFetch( } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof ImplicitFetchBuilderEntityPart that ) ) { return false; } - - final ImplicitFetchBuilderEntityPart that = (ImplicitFetchBuilderEntityPart) o; - return fetchPath.equals( that.fetchPath ) - && fetchable.equals( that.fetchable ); + else { + return fetchPath.equals( that.fetchPath ) + && fetchable.equals( that.fetchable ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderPlural.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderPlural.java index 9d1c170adef8..35b7b93e24b9 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderPlural.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderPlural.java @@ -51,17 +51,17 @@ public Fetch buildFetch( } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !(object instanceof ImplicitFetchBuilderPlural that ) ) { return false; } - - final ImplicitFetchBuilderPlural that = (ImplicitFetchBuilderPlural) o; - return fetchPath.equals( that.fetchPath ) - && fetchable.equals( that.fetchable ); + else { + return fetchPath.equals( that.fetchPath ) + && fetchable.equals( that.fetchable ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitModelPartResultBuilderBasic.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitModelPartResultBuilderBasic.java deleted file mode 100644 index d0117600d753..000000000000 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitModelPartResultBuilderBasic.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.query.results.internal.implicit; - -import org.hibernate.metamodel.mapping.BasicValuedModelPart; -import org.hibernate.query.results.ResultBuilder; -import org.hibernate.query.results.ResultBuilderBasicValued; -import org.hibernate.query.results.internal.ResultsHelper; -import org.hibernate.spi.NavigablePath; -import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.results.graph.DomainResultCreationState; -import org.hibernate.sql.results.graph.basic.BasicResult; -import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; - -/** - * @author Steve Ebersole - */ -public class ImplicitModelPartResultBuilderBasic - implements ImplicitModelPartResultBuilder, ResultBuilderBasicValued { - private final NavigablePath navigablePath; - private final BasicValuedModelPart modelPart; - - public ImplicitModelPartResultBuilderBasic(NavigablePath navigablePath, BasicValuedModelPart modelPart) { - this.navigablePath = navigablePath; - this.modelPart = modelPart; - } - - @Override - public Class getJavaType() { - return modelPart.getExpressibleJavaType().getJavaTypeClass(); - } - - @Override - public ResultBuilder cacheKeyInstance() { - return this; - } - - @Override - public BasicResult buildResult( - JdbcValuesMetadata jdbcResultsMetadata, - int resultPosition, - DomainResultCreationState domainResultCreationState) { - final TableGroup tableGroup = - ResultsHelper.impl( domainResultCreationState ).getFromClauseAccess() - .getTableGroup( navigablePath.getParent() ); - return (BasicResult) modelPart.createDomainResult( navigablePath, tableGroup, null, domainResultCreationState ); - } - - @Override - public boolean equals(Object o) { - if ( this == o ) { - return true; - } - if ( o == null || getClass() != o.getClass() ) { - return false; - } - - final ImplicitModelPartResultBuilderBasic that = (ImplicitModelPartResultBuilderBasic) o; - return navigablePath.equals( that.navigablePath ) - && modelPart.equals( that.modelPart ); - } - - @Override - public int hashCode() { - int result = navigablePath.hashCode(); - result = 31 * result + modelPart.hashCode(); - return result; - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitModelPartResultBuilderEmbeddable.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitModelPartResultBuilderEmbeddable.java deleted file mode 100644 index f467b6d64089..000000000000 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitModelPartResultBuilderEmbeddable.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.query.results.internal.implicit; - -import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; -import org.hibernate.query.results.ResultBuilder; -import org.hibernate.query.results.ResultBuilderEmbeddable; -import org.hibernate.query.results.internal.DomainResultCreationStateImpl; -import org.hibernate.query.results.internal.ResultsHelper; -import org.hibernate.spi.NavigablePath; -import org.hibernate.sql.ast.SqlAstJoinType; -import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableGroupJoin; -import org.hibernate.sql.results.graph.DomainResultCreationState; -import org.hibernate.sql.results.graph.embeddable.EmbeddableResult; -import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; - -/** - * @author Steve Ebersole - */ -public class ImplicitModelPartResultBuilderEmbeddable - implements ImplicitModelPartResultBuilder, ResultBuilderEmbeddable { - - private final NavigablePath navigablePath; - private final EmbeddableValuedModelPart modelPart; - - public ImplicitModelPartResultBuilderEmbeddable( - NavigablePath navigablePath, - EmbeddableValuedModelPart modelPart) { - this.navigablePath = navigablePath; - this.modelPart = modelPart; - } - - @Override - public Class getJavaType() { - return modelPart.getJavaType().getJavaTypeClass(); - } - - @Override - public ResultBuilder cacheKeyInstance() { - return this; - } - - @Override - public EmbeddableResult buildResult( - JdbcValuesMetadata jdbcResultsMetadata, - int resultPosition, - DomainResultCreationState domainResultCreationState) { - final DomainResultCreationStateImpl creationStateImpl = ResultsHelper.impl( domainResultCreationState ); - creationStateImpl.disallowPositionalSelections(); - return (EmbeddableResult) modelPart.createDomainResult( - navigablePath, - tableGroup( creationStateImpl ), - null, - domainResultCreationState - ); - - } - - private TableGroup tableGroup(DomainResultCreationStateImpl creationStateImpl) { - return creationStateImpl.getFromClauseAccess().resolveTableGroup( - navigablePath, - np -> { - if ( navigablePath.getParent() == null ) { - throw new IllegalStateException( - "Could not determine LHS for implicit embeddable result builder - " + navigablePath - ); - } - - final TableGroup parentTableGroup = - creationStateImpl.getFromClauseAccess() - .getTableGroup( navigablePath.getParent() ); - - final TableGroupJoin tableGroupJoin = modelPart.createTableGroupJoin( - navigablePath, - parentTableGroup, - null, - null, - SqlAstJoinType.INNER, - true, - false, - creationStateImpl - ); - - parentTableGroup.addTableGroupJoin( tableGroupJoin ); - - return tableGroupJoin.getJoinedGroup(); - } - ); - } - - @Override - public boolean equals(Object o) { - if ( this == o ) { - return true; - } - if ( o == null || getClass() != o.getClass() ) { - return false; - } - - final ImplicitModelPartResultBuilderEmbeddable that = (ImplicitModelPartResultBuilderEmbeddable) o; - return navigablePath.equals( that.navigablePath ) - && modelPart.equals( that.modelPart ); - } - - @Override - public int hashCode() { - int result = navigablePath.hashCode(); - result = 31 * result + modelPart.hashCode(); - return result; - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitModelPartResultBuilderEntity.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitModelPartResultBuilderEntity.java index 7220165dd27c..6a1503efa557 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitModelPartResultBuilderEntity.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitModelPartResultBuilderEntity.java @@ -47,13 +47,13 @@ public ResultBuilder cacheKeyInstance() { } @Override - public EntityResult buildResult( + public EntityResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { - final DomainResultCreationStateImpl creationStateImpl = ResultsHelper.impl( domainResultCreationState ); + final var creationStateImpl = ResultsHelper.impl( domainResultCreationState ); creationStateImpl.disallowPositionalSelections(); - return (EntityResult) modelPart.createDomainResult( + return (EntityResult) modelPart.createDomainResult( navigablePath, tableGroup( creationStateImpl ), null, @@ -64,34 +64,36 @@ public EntityResult buildResult( private TableGroup tableGroup(DomainResultCreationStateImpl creationStateImpl) { return creationStateImpl.getFromClauseAccess().resolveTableGroup( navigablePath, - np -> - navigablePath.getParent() != null - ? creationStateImpl.getFromClauseAccess().getTableGroup( navigablePath.getParent() ) - : modelPart.getEntityMappingType().createRootTableGroup( - // since this is only used for result set mappings, - // the canUseInnerJoins value is irrelevant. - true, - navigablePath, - null, - null, - null, - creationStateImpl - ) + path -> { + final var parentPath = navigablePath.getParent(); + return parentPath != null + ? creationStateImpl.getFromClauseAccess().getTableGroup( parentPath ) + : modelPart.getEntityMappingType().createRootTableGroup( + // since this is only used for result set mappings, + // the canUseInnerJoins value is irrelevant. + true, + navigablePath, + null, + null, + null, + creationStateImpl + ); + } ); } @Override - public boolean equals(Object o) { - if ( this == o ) { + public boolean equals(Object object) { + if ( this == object ) { return true; } - if ( o == null || getClass() != o.getClass() ) { + else if ( !( object instanceof ImplicitModelPartResultBuilderEntity that ) ) { return false; } - - final ImplicitModelPartResultBuilderEntity that = (ImplicitModelPartResultBuilderEntity) o; - return navigablePath.equals( that.navigablePath ) - && modelPart.equals( that.modelPart ); + else { + return navigablePath.equals( that.navigablePath ) + && modelPart.equals( that.modelPart ); + } } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitResultClassBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitResultClassBuilder.java index 3c71e8746bc8..794511ddaed6 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitResultClassBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitResultClassBuilder.java @@ -8,7 +8,6 @@ import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.query.results.ResultBuilder; import org.hibernate.query.results.internal.ResultSetMappingSqlSelection; -import org.hibernate.sql.ast.spi.SqlAstCreationState; import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.results.graph.DomainResult; @@ -18,6 +17,8 @@ import org.hibernate.type.BasicType; import org.hibernate.type.spi.TypeConfiguration; +import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createColumnReferenceKey; + /** * ResultBuilder for handling {@link NamedNativeQuery#resultClass()} when the * class does not refer to an entity @@ -38,20 +39,20 @@ public DomainResult buildResult( DomainResultCreationState domainResultCreationState) { assert resultPosition == 0; - final SqlAstCreationState sqlAstCreationState = domainResultCreationState.getSqlAstCreationState(); - final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); - final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); + final var sqlAstCreationState = domainResultCreationState.getSqlAstCreationState(); + final var typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); + final var sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); final int jdbcResultPosition = 1; final String columnName = jdbcResultsMetadata.resolveColumnName( jdbcResultPosition ); - final BasicType basicType = jdbcResultsMetadata.resolveType( + final var basicType = jdbcResultsMetadata.resolveType( jdbcResultPosition, typeConfiguration.getJavaTypeRegistry().resolveDescriptor( suppliedResultClass ), typeConfiguration ); - final SqlSelection selection = + final var selection = sqlSelection( resultPosition, sqlExpressionResolver, columnName, basicType, typeConfiguration ); return new BasicResult<>( selection.getValuesArrayPosition(), columnName, basicType ); } @@ -64,9 +65,8 @@ private static SqlSelection sqlSelection( TypeConfiguration typeConfiguration) { return sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlExpression( - SqlExpressionResolver.createColumnReferenceKey( columnName ), - state -> - new ResultSetMappingSqlSelection( resultPosition, (BasicValuedMapping) basicType ) + createColumnReferenceKey( columnName ), + state -> new ResultSetMappingSqlSelection( resultPosition, (BasicValuedMapping) basicType ) ), basicType.getMappedJavaType(), null, diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedDeleteHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedDeleteHandler.java index f577c35aad04..c0b83f0a861c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedDeleteHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedDeleteHandler.java @@ -6,29 +6,21 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.dialect.temptable.TemporaryTable; -import org.hibernate.dialect.temptable.TemporaryTableSessionUidColumn; import org.hibernate.dialect.temptable.TemporaryTableStrategy; -import org.hibernate.engine.jdbc.spi.JdbcServices; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.MutableObject; -import org.hibernate.metamodel.mapping.ForeignKeyDescriptor; import org.hibernate.metamodel.mapping.MappingModelExpressible; import org.hibernate.metamodel.mapping.SelectableConsumer; -import org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper; -import org.hibernate.persister.entity.EntityPersister; import org.hibernate.persister.entity.UnionSubclassEntityPersister; import org.hibernate.query.spi.DomainQueryExecutionContext; import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryParameterImplementor; import org.hibernate.query.sqm.internal.CacheableSqmInterpretation; import org.hibernate.query.sqm.internal.DomainParameterXref; -import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter; import org.hibernate.query.sqm.internal.SqmUtil; import org.hibernate.query.sqm.mutation.internal.AbstractMutationHandler; import org.hibernate.query.sqm.mutation.internal.DeleteHandler; import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter; -import org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper; import org.hibernate.query.sqm.mutation.internal.TableKeyExpressionCollector; import org.hibernate.query.sqm.mutation.spi.AfterUseAction; import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess; @@ -38,13 +30,10 @@ import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.tree.delete.DeleteStatement; 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.SqlTuple; import org.hibernate.sql.ast.tree.from.MutatingTableReferenceGroupWrapper; import org.hibernate.sql.ast.tree.from.NamedTableReference; -import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableReference; import org.hibernate.sql.ast.tree.from.UnionTableReference; import org.hibernate.sql.ast.tree.insert.InsertSelectStatement; import org.hibernate.sql.ast.tree.predicate.InSubQueryPredicate; @@ -55,7 +44,6 @@ import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.ExecutionContext; -import org.hibernate.sql.exec.spi.JdbcMutationExecutor; import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParametersList; @@ -69,6 +57,16 @@ import java.util.function.Function; import java.util.function.Supplier; +import static org.hibernate.metamodel.mapping.internal.MappingModelCreationHelper.buildColumnReferenceExpression; +import static org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter.omittingLockingAndPaging; +import static org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper.visitCollectionTableDeletes; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.createIdTableSelectQuerySpec; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.createMatchingIdsIntoIdTableInsert; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.performAfterTemporaryTableUseActions; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.performBeforeTemporaryTableUseActions; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.saveIntoTemporaryTable; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithoutIdTableHelper.createIdMatchingSubQuerySpec; + /** * @author Steve Ebersole */ @@ -107,15 +105,13 @@ public TableBasedDeleteHandler( this.sessionUidAccess = sessionUidAccess; - final TemporaryTableSessionUidColumn sessionUidColumn = idTable.getSessionUidColumn(); - if ( sessionUidColumn == null ) { - this.sessionUidParameter = null; - } - else { - this.sessionUidParameter = new SqlTypedMappingJdbcParameter( sessionUidColumn ); - } + final var sessionUidColumn = idTable.getSessionUidColumn(); + this.sessionUidParameter = + sessionUidColumn == null + ? null + : new SqlTypedMappingJdbcParameter( sessionUidColumn ); - final MultiTableSqmMutationConverter converter = new MultiTableSqmMutationConverter( + final var converter = new MultiTableSqmMutationConverter( getEntityDescriptor(), sqmDelete, sqmDelete.getTarget(), @@ -126,14 +122,14 @@ public TableBasedDeleteHandler( getSessionFactory().getSqlTranslationEngine() ); - final EntityPersister entityDescriptor = + final var entityDescriptor = getSessionFactory().getMappingMetamodel() .getEntityDescriptor( sqmDelete.getTarget().getEntityName() ); final String hierarchyRootTableName = entityDescriptor.getTableName(); - final TableGroup deletingTableGroup = converter.getMutatingTableGroup(); + final var deletingTableGroup = converter.getMutatingTableGroup(); - final TableReference hierarchyRootTableReference = deletingTableGroup.resolveTableReference( + final var hierarchyRootTableReference = deletingTableGroup.resolveTableReference( deletingTableGroup.getNavigablePath(), hierarchyRootTableName ); @@ -144,9 +140,9 @@ public TableBasedDeleteHandler( // 2) we also inspect each ColumnReference that is part of the where-clause to see which // table it comes from. if all of the referenced columns (if any at all) are from the root table // we can perform all of the deletes without using an id-table - final Predicate specifiedRestriction = converter.visitWhereClause( sqmDelete.getWhereClause() ); + final var specifiedRestriction = converter.visitWhereClause( sqmDelete.getWhereClause() ); - final PredicateCollector predicateCollector = new PredicateCollector( specifiedRestriction ); + final var predicateCollector = new PredicateCollector( specifiedRestriction ); entityDescriptor.applyBaseRestrictions( predicateCollector, deletingTableGroup, @@ -158,7 +154,7 @@ public TableBasedDeleteHandler( ); converter.pruneTableGroupJoins(); - final ColumnReferenceCheckingSqlAstWalker walker = new ColumnReferenceCheckingSqlAstWalker( + final var walker = new ColumnReferenceCheckingSqlAstWalker( hierarchyRootTableReference.getIdentificationVariable() ); if ( predicateCollector.getPredicate() != null ) { @@ -169,16 +165,17 @@ public TableBasedDeleteHandler( // The intermediate table has a FK to the root table, so we can't delete from the root table first // Deleting from the intermediate table first also isn't possible, // because that is the source for deletion in other tables, hence we need an id table - final boolean needsIdTable = !walker.isAllColumnReferencesFromIdentificationVariable() - || entityDescriptor != entityDescriptor.getRootEntityDescriptor(); + final boolean needsIdTable = + !walker.isAllColumnReferencesFromIdentificationVariable() + || entityDescriptor != entityDescriptor.getRootEntityDescriptor(); - final SqmJdbcExecutionContextAdapter executionContextAdapter = SqmJdbcExecutionContextAdapter.omittingLockingAndPaging( context ); + final var executionContextAdapter = omittingLockingAndPaging( context ); this.domainParameterXref = domainParameterXref; this.jdbcParamsXref = SqmUtil.generateJdbcParamsXref( domainParameterXref, converter ); this.resolvedParameterMappingModelTypes = converter.getSqmParameterMappingModelExpressibleResolutions(); - final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( + final var jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( context.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, @@ -200,50 +197,53 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter deletes = new ArrayList<>(); final ArrayList collectionTableDeletes = new ArrayList<>(); if ( needsIdTable ) { - final QuerySpec idTableIdentifierSubQuery = ExecuteWithTemporaryTableHelper.createIdTableSelectQuerySpec( + final var idTableIdentifierSubQuery = createIdTableSelectQuerySpec( idTable, sessionUidParameter, getEntityDescriptor(), executionContextAdapter ); - SqmMutationStrategyHelper.visitCollectionTableDeletes( + visitCollectionTableDeletes( getEntityDescriptor(), (tableReference, attributeMapping) -> { - final ForeignKeyDescriptor fkDescriptor = attributeMapping.getKeyDescriptor(); + final var foreignKeyDescriptor = attributeMapping.getKeyDescriptor(); final QuerySpec idTableFkSubQuery; - if ( fkDescriptor.getTargetPart().isEntityIdentifierMapping() ) { + if ( foreignKeyDescriptor.getTargetPart().isEntityIdentifierMapping() ) { idTableFkSubQuery = idTableIdentifierSubQuery; } else { - idTableFkSubQuery = ExecuteWithTemporaryTableHelper.createIdTableSelectQuerySpec( + idTableFkSubQuery = createIdTableSelectQuerySpec( idTable, - fkDescriptor.getTargetPart(), + foreignKeyDescriptor.getTargetPart(), sessionUidParameter, getEntityDescriptor(), executionContextAdapter ); } return new InSubQueryPredicate( - MappingModelCreationHelper.buildColumnReferenceExpression( + buildColumnReferenceExpression( new MutatingTableReferenceGroupWrapper( new NavigablePath( attributeMapping.getRootPathName() ), attributeMapping, (NamedTableReference) tableReference ), - fkDescriptor, + foreignKeyDescriptor, null, getSessionFactory() ), @@ -258,23 +258,26 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter deletes.add( createTableDeleteUsingIdTable( - tableExpression, - tableKeyColumnVisitationSupplier, - idTableIdentifierSubQuery, - executionContextAdapter - ) ) + (tableExpression, tableKeyColumnVisitationSupplier) -> + deletes.add( createTableDeleteUsingIdTable( + tableExpression, + tableKeyColumnVisitationSupplier, + idTableIdentifierSubQuery, + executionContextAdapter + ) ) ); } else { - final EntityPersister rootEntityPersister = getEntityDescriptor().getEntityPersister(); + final var rootEntityPersister = getEntityDescriptor().getEntityPersister(); final String rootTableName = rootEntityPersister.getTableName(); - final NamedTableReference rootTableReference = (NamedTableReference) deletingTableGroup.resolveTableReference( - deletingTableGroup.getNavigablePath(), - rootTableName - ); + final var rootTableReference = + (NamedTableReference) + deletingTableGroup.resolveTableReference( + deletingTableGroup.getNavigablePath(), + rootTableName + ); - final QuerySpec matchingIdSubQuerySpec = ExecuteWithoutIdTableHelper.createIdMatchingSubQuerySpec( + final var matchingIdSubQuerySpec = createIdMatchingSubQuerySpec( deletingTableGroup.getNavigablePath(), rootTableReference, predicateCollector.getPredicate(), @@ -283,21 +286,21 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter { // No need for a predicate if there is no supplied predicate i.e. this is a full cleanup if ( predicateCollector.getPredicate() == null ) { return null; } - final ForeignKeyDescriptor fkDescriptor = attributeMapping.getKeyDescriptor(); + final var foreignKeyDescriptor = attributeMapping.getKeyDescriptor(); final QuerySpec idSelectFkSubQuery; // todo (6.0): based on the location of the attribute mapping, we could prune the table group of the subquery - if ( fkDescriptor.getTargetPart().isEntityIdentifierMapping() ) { + if ( foreignKeyDescriptor.getTargetPart().isEntityIdentifierMapping() ) { idSelectFkSubQuery = matchingIdSubQuerySpec; } else { - idSelectFkSubQuery = ExecuteWithoutIdTableHelper.createIdMatchingSubQuerySpec( + idSelectFkSubQuery = createIdMatchingSubQuerySpec( deletingTableGroup.getNavigablePath(), rootTableReference, predicateCollector.getPredicate(), @@ -307,13 +310,13 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter MappingModelExpressible getResolvedMappingModelType(SqmParameter { - final NamedTableReference tableReference = new NamedTableReference( - tableExpression, - deletingTableGroup.getPrimaryTableReference().getIdentificationVariable() - ); - final QuerySpec idMatchingSubQuerySpec; - // No need for a predicate if there is no supplied predicate i.e. this is a full cleanup - if ( predicateCollector.getPredicate() == null ) { - idMatchingSubQuerySpec = null; - } - else { - idMatchingSubQuerySpec = matchingIdSubQuerySpec; - } deletes.add( createNonRootTableDeleteWithoutIdTable( - tableReference, + new NamedTableReference( tableExpression, + deletingTableGroup.getPrimaryTableReference() + .getIdentificationVariable() ), tableKeyColumnVisitationSupplier, converter.getSqlExpressionResolver(), - deletingTableGroup, - idMatchingSubQuerySpec, + predicateCollector.getPredicate() == null + // No need for a predicate if there is no supplied predicate + // i.e. this is a full cleanup + ? null + : matchingIdSubQuerySpec, jdbcParameterBindings, executionContextAdapter ) ); @@ -358,25 +354,22 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter { if ( !tableExpression.equals( rootTableName ) ) { - final NamedTableReference tableReference = (NamedTableReference) deletingTableGroup.getTableReference( - deletingTableGroup.getNavigablePath(), - tableExpression, - true - ); - final QuerySpec idMatchingSubQuerySpec; - // No need for a predicate if there is no supplied predicate i.e. this is a full cleanup - if ( predicateCollector.getPredicate() == null ) { - idMatchingSubQuerySpec = null; - } - else { - idMatchingSubQuerySpec = matchingIdSubQuerySpec; - } + final var tableReference = + (NamedTableReference) + deletingTableGroup.getTableReference( + deletingTableGroup.getNavigablePath(), + tableExpression, + true + ); deletes.add( createNonRootTableDeleteWithoutIdTable( tableReference, tableKeyColumnVisitationSupplier, converter.getSqlExpressionResolver(), - deletingTableGroup, - idMatchingSubQuerySpec, + predicateCollector.getPredicate() == null + // No need for a predicate if there is no supplied predicate + // i.e. this is a full cleanup + ? null + : matchingIdSubQuerySpec, jdbcParameterBindings, executionContextAdapter ) ); @@ -402,41 +395,27 @@ private JdbcOperationQueryMutation createTableDeleteUsingIdTable( Supplier> tableKeyColumnVisitationSupplier, QuerySpec idTableSubQuery, ExecutionContext executionContext) { - final TableKeyExpressionCollector keyColumnCollector = new TableKeyExpressionCollector( getEntityDescriptor() ); - final NamedTableReference targetTable = new NamedTableReference( - tableExpression, - DeleteStatement.DEFAULT_ALIAS, - true - ); - + final var keyColumnCollector = new TableKeyExpressionCollector( getEntityDescriptor() ); + final var targetTable = + new NamedTableReference( tableExpression, DeleteStatement.DEFAULT_ALIAS, true ); tableKeyColumnVisitationSupplier.get().accept( (columnIndex, selection) -> { assert selection.getContainingTableExpression().equals( tableExpression ); assert ! selection.isFormula(); assert selection.getCustomReadExpression() == null; assert selection.getCustomWriteExpression() == null; - - keyColumnCollector.apply( - new ColumnReference( - targetTable, - selection - ) - ); + keyColumnCollector.apply( new ColumnReference( targetTable, selection ) ); } ); - final InSubQueryPredicate predicate = new InSubQueryPredicate( + final var predicate = new InSubQueryPredicate( keyColumnCollector.buildKeyExpression(), idTableSubQuery, false ); - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); - - final JdbcServices jdbcServices = factory.getJdbcServices(); - - return jdbcServices.getJdbcEnvironment() - .getSqlAstTranslatorFactory() + final var factory = executionContext.getSession().getFactory(); + return factory.getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory() .buildMutationTranslator( factory, new DeleteStatement( targetTable, predicate ) ) .translate( JdbcParameterBindings.NO_BINDINGS, executionContext.getQueryOptions() ); } @@ -447,13 +426,8 @@ private JdbcOperationQueryMutation createRootTableDeleteWithoutIdTable( Predicate predicate, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext) { - - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); - - final JdbcServices jdbcServices = factory.getJdbcServices(); - - return jdbcServices.getJdbcEnvironment() - .getSqlAstTranslatorFactory() + final var factory = executionContext.getSession().getFactory(); + return factory.getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory() .buildMutationTranslator( factory, new DeleteStatement( rootTableReference, predicate ) ) .translate( jdbcParameterBindings, executionContext.getQueryOptions() ); } @@ -462,20 +436,33 @@ private JdbcOperationQueryMutation createNonRootTableDeleteWithoutIdTable( NamedTableReference targetTableReference, Supplier> tableKeyColumnVisitationSupplier, SqlExpressionResolver sqlExpressionResolver, - TableGroup rootTableGroup, QuerySpec matchingIdSubQuerySpec, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext) { assert targetTableReference != null; + final var deleteTableReference = + new NamedTableReference( + targetTableReference.getTableExpression(), + DeleteStatement.DEFAULT_ALIAS, + true + ); + final var sqlAstDelete = + new DeleteStatement( deleteTableReference, + tableDeletePredicate( tableKeyColumnVisitationSupplier, sqlExpressionResolver, + matchingIdSubQuerySpec, deleteTableReference ) ); + final var factory = executionContext.getSession().getFactory(); + return factory.getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory() + .buildMutationTranslator( factory, sqlAstDelete ) + .translate( jdbcParameterBindings, executionContext.getQueryOptions() ); + } - final NamedTableReference deleteTableReference = new NamedTableReference( - targetTableReference.getTableExpression(), - DeleteStatement.DEFAULT_ALIAS, - true - ); - final Predicate tableDeletePredicate; + private @Nullable Predicate tableDeletePredicate( + Supplier> tableKeyColumnVisitationSupplier, + SqlExpressionResolver sqlExpressionResolver, + QuerySpec matchingIdSubQuerySpec, + NamedTableReference deleteTableReference) { if ( matchingIdSubQuerySpec == null ) { - tableDeletePredicate = null; + return null; } else { /* @@ -493,45 +480,25 @@ private JdbcOperationQueryMutation createNonRootTableDeleteWithoutIdTable( tableKeyColumnVisitationSupplier.get().accept( (columnIndex, selection) -> { assert deleteTableReference.getTableReference( selection.getContainingTableExpression() ) != null; - - final Expression expression = sqlExpressionResolver.resolveSqlExpression( - deleteTableReference, - selection - ); - + final var expression = + sqlExpressionResolver.resolveSqlExpression( deleteTableReference, selection ); deletingTableColumnRefs.add( (ColumnReference) expression ); } ); - final Expression deletingTableColumnRefsExpression; - if ( deletingTableColumnRefs.size() == 1 ) { - deletingTableColumnRefsExpression = deletingTableColumnRefs.get( 0 ); - } - else { - deletingTableColumnRefsExpression = new SqlTuple( deletingTableColumnRefs, getEntityDescriptor().getIdentifierMapping() ); - } - - tableDeletePredicate = new InSubQueryPredicate( - deletingTableColumnRefsExpression, + return new InSubQueryPredicate( + deletingTableColumnRefs.size() == 1 + ? deletingTableColumnRefs.get( 0 ) + : new SqlTuple( deletingTableColumnRefs, getEntityDescriptor().getIdentifierMapping() ), matchingIdSubQuerySpec, false ); } - - final DeleteStatement sqlAstDelete = new DeleteStatement( deleteTableReference, tableDeletePredicate ); - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); - - final JdbcServices jdbcServices = factory.getJdbcServices(); - - return jdbcServices.getJdbcEnvironment() - .getSqlAstTranslatorFactory() - .buildMutationTranslator( factory, sqlAstDelete ) - .translate( jdbcParameterBindings, executionContext.getQueryOptions() ); } @Override public JdbcParameterBindings createJdbcParameterBindings(DomainQueryExecutionContext context) { - final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( + final var jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( context.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, @@ -561,12 +528,12 @@ public boolean dependsOnParameterBindings() { if ( idTableInsert != null && idTableInsert.jdbcOperation().dependsOnParameterBindings() ) { return true; } - for ( JdbcOperationQueryMutation delete : deletes ) { + for ( var delete : deletes ) { if ( delete.dependsOnParameterBindings() ) { return true; } } - for ( JdbcOperationQueryMutation delete : collectionTableDeletes ) { + for ( var delete : collectionTableDeletes ) { if ( delete.dependsOnParameterBindings() ) { return true; } @@ -580,12 +547,12 @@ public boolean isCompatibleWith(JdbcParameterBindings jdbcParameterBindings, Que && !idTableInsert.jdbcOperation().isCompatibleWith( jdbcParameterBindings, queryOptions ) ) { return false; } - for ( JdbcOperationQueryMutation delete : deletes ) { + for ( var delete : deletes ) { if ( !delete.isCompatibleWith( jdbcParameterBindings, queryOptions ) ) { return false; } } - for ( JdbcOperationQueryMutation delete : collectionTableDeletes ) { + for ( var delete : collectionTableDeletes ) { if ( !delete.isCompatibleWith( jdbcParameterBindings, queryOptions ) ) { return false; } @@ -601,21 +568,21 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu getSqmStatement().getTarget().getModel().getName() ); } - final SqmJdbcExecutionContextAdapter executionContext = SqmJdbcExecutionContextAdapter.omittingLockingAndPaging( context ); + final var executionContext = omittingLockingAndPaging( context ); if ( idTableInsert != null ) { - ExecuteWithTemporaryTableHelper.performBeforeTemporaryTableUseActions( + performBeforeTemporaryTableUseActions( idTable, temporaryTableStrategy, executionContext ); try { - final int rows = ExecuteWithTemporaryTableHelper.saveIntoTemporaryTable( + final int rows = saveIntoTemporaryTable( idTableInsert.jdbcOperation(), jdbcParameterBindings, executionContext ); - final JdbcParameterBindings sessionUidBindings = new JdbcParameterBindingsImpl( 1 ); + final var sessionUidBindings = new JdbcParameterBindingsImpl( 1 ); if ( sessionUidParameter != null ) { sessionUidBindings.addBinding( sessionUidParameter, @@ -625,9 +592,10 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu ) ); } - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); - final JdbcMutationExecutor jdbcMutationExecutor = factory.getJdbcServices().getJdbcMutationExecutor(); - for ( JdbcOperationQueryMutation delete : collectionTableDeletes ) { + final var jdbcMutationExecutor = + executionContext.getSession().getFactory() + .getJdbcServices().getJdbcMutationExecutor(); + for ( var delete : collectionTableDeletes ) { jdbcMutationExecutor.execute( delete, sessionUidBindings, @@ -639,7 +607,7 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu executionContext ); } - for ( JdbcOperationQueryMutation delete : deletes ) { + for ( var delete : deletes ) { jdbcMutationExecutor.execute( delete, sessionUidBindings, @@ -654,7 +622,7 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu return rows; } finally { - ExecuteWithTemporaryTableHelper.performAfterTemporaryTableUseActions( + performAfterTemporaryTableUseActions( idTable, sessionUidAccess, getAfterUseAction(), @@ -663,16 +631,15 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu } } else { - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); - final JdbcMutationExecutor jdbcMutationExecutor = factory.getJdbcServices().getJdbcMutationExecutor(); - for ( JdbcOperationQueryMutation delete : collectionTableDeletes ) { + final var jdbcMutationExecutor = + executionContext.getSession().getFactory() + .getJdbcServices().getJdbcMutationExecutor(); + for ( var delete : collectionTableDeletes ) { jdbcMutationExecutor.execute( delete, jdbcParameterBindings, - sql -> executionContext.getSession() - .getJdbcCoordinator() - .getStatementPreparer() - .prepareStatement( sql ), + sql -> executionContext.getSession().getJdbcCoordinator() + .getStatementPreparer().prepareStatement( sql ), (integer, preparedStatement) -> {}, executionContext ); @@ -680,14 +647,12 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu if ( getEntityDescriptor() instanceof UnionSubclassEntityPersister ) { int rows = 0; - for ( JdbcOperationQueryMutation delete : deletes ) { + for ( var delete : deletes ) { rows += jdbcMutationExecutor.execute( delete, jdbcParameterBindings, - sql -> executionContext.getSession() - .getJdbcCoordinator() - .getStatementPreparer() - .prepareStatement( sql ), + sql -> executionContext.getSession().getJdbcCoordinator() + .getStatementPreparer().prepareStatement( sql ), (integer, preparedStatement) -> {}, executionContext ); @@ -696,14 +661,12 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu } else { int rows = 0; - for ( JdbcOperationQueryMutation delete : deletes ) { + for ( var delete : deletes ) { rows = jdbcMutationExecutor.execute( delete, jdbcParameterBindings, - sql -> executionContext.getSession() - .getJdbcCoordinator() - .getStatementPreparer() - .prepareStatement( sql ), + sql -> executionContext.getSession().getJdbcCoordinator() + .getStatementPreparer().prepareStatement( sql ), (integer, preparedStatement) -> {}, executionContext ); 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 0941785e37a7..1bf721286694 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 @@ -7,30 +7,20 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.dialect.temptable.TemporaryTable; import org.hibernate.dialect.temptable.TemporaryTableColumn; -import org.hibernate.dialect.temptable.TemporaryTableSessionUidColumn; import org.hibernate.dialect.temptable.TemporaryTableStrategy; import org.hibernate.engine.FetchTiming; -import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.BeforeExecutionGenerator; import org.hibernate.generator.Generator; import org.hibernate.generator.OnExecutionGenerator; -import org.hibernate.generator.values.GeneratedValues; -import org.hibernate.generator.values.GeneratedValuesMutationDelegate; import org.hibernate.id.BulkInsertionCapableIdentifierGenerator; import org.hibernate.id.OptimizableGenerator; -import org.hibernate.id.enhanced.Optimizer; import org.hibernate.id.insert.Binder; import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate; import org.hibernate.internal.util.MutableObject; -import org.hibernate.internal.util.collections.ArrayHelper; -import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping; -import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityMappingType; -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.query.SemanticException; import org.hibernate.query.SortDirection; @@ -47,16 +37,13 @@ import org.hibernate.query.sqm.mutation.internal.AbstractMutationHandler; import org.hibernate.query.sqm.mutation.internal.InsertHandler; import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter; -import org.hibernate.query.sqm.mutation.internal.SqmInsertStrategyHelper; import org.hibernate.query.sqm.mutation.spi.AfterUseAction; import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess; -import org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter; import org.hibernate.query.sqm.sql.internal.SqmPathInterpretation; import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.insert.SqmInsertSelectStatement; import org.hibernate.query.sqm.tree.insert.SqmInsertStatement; import org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement; -import org.hibernate.query.sqm.tree.insert.SqmValues; import org.hibernate.sql.ast.tree.expression.ColumnReference; import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.JdbcParameter; @@ -71,11 +58,9 @@ import org.hibernate.sql.ast.tree.insert.Values; import org.hibernate.sql.ast.tree.predicate.ComparisonPredicate; import org.hibernate.sql.ast.tree.predicate.Predicate; -import org.hibernate.sql.ast.tree.select.QueryPart; import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.ast.tree.select.SortSpecification; -import org.hibernate.sql.ast.tree.update.Assignable; import org.hibernate.sql.ast.tree.update.Assignment; import org.hibernate.sql.ast.tree.update.UpdateStatement; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; @@ -83,7 +68,6 @@ import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; -import org.hibernate.sql.exec.spi.JdbcParameterBinder; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParametersList; import org.hibernate.sql.exec.spi.JdbcSelect; @@ -91,13 +75,11 @@ import org.hibernate.sql.results.internal.SqlSelectionImpl; import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.type.BasicType; -import org.hibernate.type.descriptor.ValueBinder; import org.jboss.logging.Logger; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -106,8 +88,19 @@ import java.util.function.Function; import java.util.stream.IntStream; +import static java.util.Collections.singletonList; import static org.hibernate.generator.EventType.INSERT; +import static org.hibernate.internal.util.collections.ArrayHelper.indexOf; +import static org.hibernate.internal.util.collections.CollectionHelper.mapOfSize; +import static org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter.omittingLockingAndPaging; +import static org.hibernate.query.sqm.mutation.internal.SqmInsertStrategyHelper.createRowNumberingExpression; import static org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper.isId; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.createInsertedRowNumbersSelectSql; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.createTemporaryTableInsert; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.loadInsertedRowNumbers; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.performAfterTemporaryTableUseActions; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.performBeforeTemporaryTableUseActions; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.saveIntoTemporaryTable; /** * @author Christian Beikov @@ -143,16 +136,15 @@ public TableBasedInsertHandler( this.entityTable = entityTable; this.sessionUidAccess = sessionUidAccess; - final TemporaryTableSessionUidColumn sessionUidColumn = entityTable.getSessionUidColumn(); - if ( sessionUidColumn == null ) { - this.sessionUidParameter = null; - } - else { - this.sessionUidParameter = new SqlTypedMappingJdbcParameter( sessionUidColumn ); - } - final SqmJdbcExecutionContextAdapter executionContext = SqmJdbcExecutionContextAdapter.omittingLockingAndPaging( context ); - final MultiTableSqmMutationConverter sqmConverter = new MultiTableSqmMutationConverter( - getEntityDescriptor(), + final var sessionUidColumn = entityTable.getSessionUidColumn(); + this.sessionUidParameter = + sessionUidColumn == null + ? null + : new SqlTypedMappingJdbcParameter( sessionUidColumn ); + final var executionContext = omittingLockingAndPaging( context ); + final var entityDescriptor = getEntityDescriptor(); + final var sqmConverter = new MultiTableSqmMutationConverter( + entityDescriptor, sqmInsert, sqmInsert.getTarget(), domainParameterXref, @@ -162,26 +154,27 @@ public TableBasedInsertHandler( getSessionFactory().getSqlTranslationEngine() ); - final TableGroup insertingTableGroup = sqmConverter.getMutatingTableGroup(); + final var insertingTableGroup = sqmConverter.getMutatingTableGroup(); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // visit the insertion target using our special converter, collecting // information about the target paths final List targetPathColumns = new ArrayList<>(); - final NamedTableReference entityTableReference = new NamedTableReference( + final var entityTableReference = new NamedTableReference( entityTable.getTableExpression(), TemporaryTable.DEFAULT_ALIAS, true ); - final InsertSelectStatement insertStatement = new InsertSelectStatement( entityTableReference ); + final var insertStatement = new InsertSelectStatement( entityTableReference ); - final BaseSqmToSqlAstConverter.AdditionalInsertValues additionalInsertValues = sqmConverter.visitInsertionTargetPaths( + final var additionalInsertValues = sqmConverter.visitInsertionTargetPaths( (assignable, columnReferences) -> { - final SqmPathInterpretation pathInterpretation = (SqmPathInterpretation) assignable; - final List columns = - entityTable.findTemporaryTableColumns( getEntityDescriptor(), pathInterpretation.getExpressionType() ); - for ( TemporaryTableColumn column : columns ) { + final var pathInterpretation = (SqmPathInterpretation) assignable; + final var columns = + entityTable.findTemporaryTableColumns( entityDescriptor, + pathInterpretation.getExpressionType() ); + for ( var column : columns ) { insertStatement.addTargetColumnReference( new ColumnReference( entityTableReference, column.getColumnName(), @@ -191,7 +184,7 @@ public TableBasedInsertHandler( targetPathColumns.add( new Assignment( assignable, (Expression) assignable ) ); }, sqmInsert, - getEntityDescriptor(), + entityDescriptor, insertingTableGroup ); @@ -199,35 +192,33 @@ public TableBasedInsertHandler( // visit the where-clause using our special converter, collecting information // about the restrictions - if ( sqmInsert instanceof SqmInsertSelectStatement ) { - final QueryPart queryPart = sqmConverter.visitQueryPart( ( (SqmInsertSelectStatement) sqmInsert ).getSelectQueryPart() ); + if ( sqmInsert instanceof SqmInsertSelectStatement sqmInsertSelectStatement ) { + final var queryPart = + sqmConverter.visitQueryPart( sqmInsertSelectStatement.getSelectQueryPart() ); queryPart.visitQuerySpecs( querySpec -> { if ( additionalInsertValues.applySelections( querySpec, getSessionFactory() ) ) { - final TemporaryTableColumn rowNumberColumn = entityTable.getColumns() + final var rowNumberColumn = entityTable.getColumns() .get( entityTable.getColumns().size() - ( sessionUidColumn == null ? 1 : 2 ) ); - final ColumnReference columnReference = new ColumnReference( + final var columnReference = new ColumnReference( (String) null, rowNumberColumn.getColumnName(), false, null, rowNumberColumn.getJdbcMapping() ); - insertStatement.getTargetColumns().set( - insertStatement.getTargetColumns().size() - 1, - columnReference - ); - targetPathColumns.set( - targetPathColumns.size() - 1, - new Assignment( columnReference, columnReference ) - ); + insertStatement.getTargetColumns() + .set( insertStatement.getTargetColumns().size() - 1, + columnReference ); + targetPathColumns.set( targetPathColumns.size() - 1, + new Assignment( columnReference, columnReference ) ); } - else if ( !(getEntityDescriptor().getGenerator() instanceof OnExecutionGenerator generator - && generator.generatedOnExecution()) + else if ( !( entityDescriptor.getGenerator() instanceof OnExecutionGenerator generator + && generator.generatedOnExecution() ) && !entityTable.isRowNumberGenerated() ) { - final TemporaryTableColumn rowNumberColumn = entityTable.getColumns() + final var rowNumberColumn = entityTable.getColumns() .get( entityTable.getColumns().size() - ( sessionUidColumn == null ? 1 : 2 ) ); - final ColumnReference columnReference = new ColumnReference( + final var columnReference = new ColumnReference( (String) null, rowNumberColumn.getColumnName(), false, @@ -236,28 +227,23 @@ else if ( !(getEntityDescriptor().getGenerator() instanceof OnExecutionGenerator ); insertStatement.getTargetColumns().add( columnReference ); targetPathColumns.add( new Assignment( columnReference, columnReference ) ); - querySpec.getSelectClause().addSqlSelection( - new SqlSelectionImpl( - 0, - SqmInsertStrategyHelper.createRowNumberingExpression( - querySpec, - getSessionFactory() - ) - ) - ); + querySpec.getSelectClause() + .addSqlSelection( new SqlSelectionImpl(0, + createRowNumberingExpression( querySpec, getSessionFactory() ) ) ); } if ( sessionUidColumn != null ) { - final ColumnReference sessionUidColumnReference = new ColumnReference( + final var sessionUidColumnReference = new ColumnReference( (String) null, sessionUidColumn.getColumnName(), false, null, sessionUidColumn.getJdbcMapping() ); - querySpec.getSelectClause().addSqlSelection( new SqlSelectionImpl( - insertStatement.getTargetColumns().size(), - sessionUidParameter - ) ); + querySpec.getSelectClause() + .addSqlSelection( new SqlSelectionImpl( + insertStatement.getTargetColumns().size(), + sessionUidParameter + ) ); insertStatement.getTargetColumns().add( sessionUidColumnReference ); targetPathColumns.add( new Assignment( sessionUidColumnReference, sessionUidParameter ) ); } @@ -268,13 +254,13 @@ else if ( !(getEntityDescriptor().getGenerator() instanceof OnExecutionGenerator else { // Add the row number column if there is one final BasicType rowNumberType; - if ( !(getEntityDescriptor().getGenerator() instanceof OnExecutionGenerator generator - && generator.generatedOnExecution()) + if ( !( entityDescriptor.getGenerator() instanceof OnExecutionGenerator generator + && generator.generatedOnExecution() ) && !entityTable.isRowNumberGenerated() ) { - final TemporaryTableColumn rowNumberColumn = entityTable.getColumns() + final var rowNumberColumn = entityTable.getColumns() .get( entityTable.getColumns().size() - (sessionUidColumn == null ? 1 : 2) ); rowNumberType = (BasicType) rowNumberColumn.getJdbcMapping(); - final ColumnReference columnReference = new ColumnReference( + final var columnReference = new ColumnReference( (String) null, rowNumberColumn.getColumnName(), false, @@ -288,7 +274,7 @@ else if ( !(getEntityDescriptor().getGenerator() instanceof OnExecutionGenerator rowNumberType = null; } if ( sessionUidColumn != null ) { - final ColumnReference sessionUidColumnReference = new ColumnReference( + final var sessionUidColumnReference = new ColumnReference( (String) null, sessionUidColumn.getColumnName(), false, @@ -298,19 +284,17 @@ else if ( !(getEntityDescriptor().getGenerator() instanceof OnExecutionGenerator insertStatement.getTargetColumns().add( sessionUidColumnReference ); targetPathColumns.add( new Assignment( sessionUidColumnReference, sessionUidParameter ) ); } - final List sqmValuesList = ( (SqmInsertValuesStatement) sqmInsert ).getValuesList(); + final var sqmValuesList = ( (SqmInsertValuesStatement) sqmInsert ).getValuesList(); final List valuesList = new ArrayList<>( sqmValuesList.size() ); for ( int i = 0; i < sqmValuesList.size(); i++ ) { - final Values values = sqmConverter.visitValues( sqmValuesList.get( i ) ); + final var values = sqmConverter.visitValues( sqmValuesList.get( i ) ); additionalInsertValues.applyValues( values ); if ( rowNumberType != null ) { - values.getExpressions().add( - new QueryLiteral<>( - rowNumberType.getJavaTypeDescriptor() - .wrap( i + 1, getSessionFactory().getWrapperOptions() ), - rowNumberType - ) - ); + values.getExpressions().add( new QueryLiteral<>( + rowNumberType.getJavaTypeDescriptor() + .wrap( i + 1, getSessionFactory().getWrapperOptions() ), + rowNumberType + ) ); } if ( sessionUidParameter != null ) { values.getExpressions().add( sessionUidParameter ); @@ -319,36 +303,38 @@ else if ( !(getEntityDescriptor().getGenerator() instanceof OnExecutionGenerator } insertStatement.setValuesList( valuesList ); } - final ConflictClause conflictClause = sqmConverter.visitConflictClause( sqmInsert.getConflictClause() ); + final var conflictClause = sqmConverter.visitConflictClause( sqmInsert.getConflictClause() ); sqmConverter.pruneTableGroupJoins(); boolean assignsId = false; - for ( Assignment assignment : targetPathColumns ) { - assignsId = assignsId || assignment.getAssignable() instanceof SqmPathInterpretation pathInterpretation - && isId( pathInterpretation.getExpressionType() ); + for ( var assignment : targetPathColumns ) { + assignsId = assignsId + || assignment.getAssignable() instanceof SqmPathInterpretation pathInterpretation + && isId( pathInterpretation.getExpressionType() ); } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // cross-reference the TableReference by alias. The TableGroup already // cross-references it by name, but the ColumnReference only has the alias - final Map tableReferenceByAlias = CollectionHelper.mapOfSize( insertingTableGroup.getTableReferenceJoins().size() + 1 ); + final Map tableReferenceByAlias = + mapOfSize( insertingTableGroup.getTableReferenceJoins().size() + 1 ); collectTableReference( insertingTableGroup.getPrimaryTableReference(), tableReferenceByAlias::put ); for ( int i = 0; i < insertingTableGroup.getTableReferenceJoins().size(); i++ ) { collectTableReference( insertingTableGroup.getTableReferenceJoins().get( i ), tableReferenceByAlias::put ); } - final ModelPartContainer updatingModelPart = insertingTableGroup.getModelPart(); + final var updatingModelPart = insertingTableGroup.getModelPart(); assert updatingModelPart instanceof EntityMappingType; final Map> assignmentsByTable = - CollectionHelper.mapOfSize( insertingTableGroup.getTableReferenceJoins().size() + 1 ); + mapOfSize( insertingTableGroup.getTableReferenceJoins().size() + 1 ); this.domainParameterXref = domainParameterXref; this.jdbcParamsXref = SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmConverter ); this.resolvedParameterMappingModelTypes = sqmConverter.getSqmParameterMappingModelExpressibleResolutions(); - final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( + final var jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( context.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, @@ -375,15 +361,14 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter assignmentColumnRefs = assignable.getColumnReferences(); + final var assignment = targetPathColumns.get( i ); + final var assignable = assignment.getAssignable(); + final var assignmentColumnRefs = assignable.getColumnReferences(); TableReference assignmentTableReference = null; - for ( int c = 0; c < assignmentColumnRefs.size(); c++ ) { - final ColumnReference columnReference = assignmentColumnRefs.get( c ); - final TableReference tableReference = resolveTableReference( columnReference, tableReferenceByAlias ); + final var columnReference = assignmentColumnRefs.get( c ); + final var tableReference = resolveTableReference( columnReference, tableReferenceByAlias ); if ( assignmentTableReference != null && assignmentTableReference != tableReference ) { throw new SemanticException( "Assignment referred to columns from multiple tables: " + i ); @@ -392,48 +377,51 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter new ArrayList<>() ).add( assignment ); } - this.temporaryTableInsert = ExecuteWithTemporaryTableHelper.createTemporaryTableInsert( - insertStatement, - jdbcParameterBindings, - executionContext - ); + this.temporaryTableInsert = + createTemporaryTableInsert( + insertStatement, + jdbcParameterBindings, + executionContext + ); - final int tableSpan = getEntityDescriptor().getTableSpan(); + final int tableSpan = entityDescriptor.getTableSpan(); this.rootTableInserter = createRootTableInserter( insertStatement, insertingTableGroup, conflictClause, assignsId, - getEntityDescriptor().getTableName( 0 ), - getEntityDescriptor().getKeyColumns( 0 ), + entityDescriptor.getTableName( 0 ), + entityDescriptor.getKeyColumns( 0 ), assignmentsByTable, executionContext ); final ArrayList nonRootTableInserts = new ArrayList<>( tableSpan ); - if ( getEntityDescriptor().hasDuplicateTables() ) { - final String[] insertedTables = new String[tableSpan]; - insertedTables[0] = getEntityDescriptor().getTableName( 0 ); + if ( entityDescriptor.hasDuplicateTables() ) { + final var insertedTables = new String[tableSpan]; + insertedTables[0] = entityDescriptor.getTableName( 0 ); for ( int i = 1; i < tableSpan; i++ ) { - if ( getEntityDescriptor().isInverseTable( i ) ) { + if ( entityDescriptor.isInverseTable( i ) ) { continue; } - final String tableName = getEntityDescriptor().getTableName( i ); + final String tableName = entityDescriptor.getTableName( i ); insertedTables[i] = tableName; - if ( ArrayHelper.indexOf( insertedTables, i, tableName ) != -1 ) { + if ( indexOf( insertedTables, i, tableName ) != -1 ) { // Since secondary tables could appear multiple times, we have to skip duplicates continue; } - final JdbcOperationQueryMutation insert = createTableInsert( + final var insert = createTableInsert( insertStatement, insertingTableGroup, tableName, - getEntityDescriptor().getKeyColumns( i ), - getEntityDescriptor().isNullableTable( i ), + entityDescriptor.getKeyColumns( i ), + entityDescriptor.isNullableTable( i ), assignmentsByTable, executionContext ); @@ -444,12 +432,12 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter> assignmentsByTable, ExecutionContext executionContext) { - final TableReference updatingTableReference = updatingTableGroup.getTableReference( + final var updatingTableReference = updatingTableGroup.getTableReference( updatingTableGroup.getNavigablePath(), tableExpression, true ); - final Generator generator = getEntityDescriptor().getGenerator(); - final List assignments = assignmentsByTable.get( tableExpression ); + final var generator = getEntityDescriptor().getGenerator(); + final var assignments = assignmentsByTable.get( tableExpression ); if ( !assignsId - && (assignments == null || assignments.isEmpty()) + && ( assignments == null || assignments.isEmpty() ) && !generator.generatedOnExecution() - && (!(generator instanceof BulkInsertionCapableIdentifierGenerator) - || ((BulkInsertionCapableIdentifierGenerator) generator).supportsBulkInsertionIdentifierGeneration()) ) { + && ( !( generator instanceof BulkInsertionCapableIdentifierGenerator bulkInsertionCapable ) + || bulkInsertionCapable.supportsBulkInsertionIdentifierGeneration() ) ) { throw new IllegalStateException( "There must be at least a single root table assignment" ); } - final NamedTableReference dmlTableReference = resolveUnionTableReference( updatingTableReference, tableExpression ); + final var dmlTableReference = resolveUnionTableReference( updatingTableReference, tableExpression ); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Create the SQL AST and convert it into a JdbcOperation - final QuerySpec querySpec = new QuerySpec( true ); - final NamedTableReference temporaryTableReference = new NamedTableReference( + final var querySpec = new QuerySpec( true ); + final var temporaryTableReference = new NamedTableReference( translatedInsertStatement.getTargetTable().getTableExpression(), "hte_tmp" ); - final TableGroupImpl temporaryTableGroup = new TableGroupImpl( + final var temporaryTableGroup = new TableGroupImpl( updatingTableGroup.getNavigablePath(), null, temporaryTableReference, @@ -529,29 +517,32 @@ private RootTableInserter createRootTableInserter( querySpec.setFetchClauseExpression( new QueryLiteral<>( 1, - executionContext.getSession().getFactory().getQueryEngine().getCriteriaBuilder().getIntegerType() + executionContext.getSession().getFactory().getQueryEngine() + .getCriteriaBuilder().getIntegerType() ), FetchClauseType.ROWS_ONLY ); } - final InsertSelectStatement insertStatement = new InsertSelectStatement( dmlTableReference ); + final var insertStatement = new InsertSelectStatement( dmlTableReference ); insertStatement.setConflictClause( conflictClause ); insertStatement.setSourceSelectStatement( querySpec ); - applyAssignments( assignments, insertStatement, temporaryTableReference, getEntityDescriptor() ); - final JdbcServices jdbcServices = getSessionFactory().getJdbcServices(); - final SharedSessionContractImplementor session = executionContext.getSession(); + applyAssignments( assignments, insertStatement, temporaryTableReference ); final JdbcSelect temporaryTableIdentitySelect; final JdbcOperationQueryMutation temporaryTableIdUpdate; final String temporaryTableRowNumberSelectSql; final JdbcOperationQueryMutation rootTableInsert; final JdbcOperationQueryMutation temporaryTableIdentityUpdate; final String rootTableInsertWithReturningSql; + final var sqlAstTranslatorFactory = + getSessionFactory().getJdbcServices() + .getJdbcEnvironment().getSqlAstTranslatorFactory(); if ( !assignsId && generator.generatedOnExecution() ) { - final BasicEntityIdentifierMapping identifierMapping = - (BasicEntityIdentifierMapping) getEntityDescriptor().getIdentifierMapping(); - final QuerySpec idSelectQuerySpec = new QuerySpec( true ); + final var identifierMapping = + (BasicEntityIdentifierMapping) + getEntityDescriptor().getIdentifierMapping(); + final var idSelectQuerySpec = new QuerySpec( true ); idSelectQuerySpec.getFromClause().addRoot( temporaryTableGroup ); - final ColumnReference columnReference = new ColumnReference( + final var columnReference = new ColumnReference( (String) null, TemporaryTable.ENTITY_TABLE_IDENTITY_COLUMN, false, @@ -567,7 +558,7 @@ private RootTableInserter createRootTableInserter( ) ); if ( entityTable.getSessionUidColumn() != null ) { - final TemporaryTableColumn sessionUidColumn = entityTable.getSessionUidColumn(); + final var sessionUidColumn = entityTable.getSessionUidColumn(); idSelectQuerySpec.applyPredicate( new ComparisonPredicate( new ColumnReference( temporaryTableReference, @@ -580,24 +571,21 @@ private RootTableInserter createRootTableInserter( sessionUidParameter ) ); } - final SelectStatement selectStatement = new SelectStatement( - idSelectQuerySpec, - Collections.singletonList( - new BasicFetch<>( + final var selectStatement = + new SelectStatement( + idSelectQuerySpec, + singletonList( new BasicFetch<>( 0, null, null, identifierMapping, FetchTiming.IMMEDIATE, - null, false - ) - ) - ); - temporaryTableIdentitySelect = jdbcServices.getJdbcEnvironment() - .getSqlAstTranslatorFactory() - .buildSelectTranslator( getSessionFactory(), selectStatement ) - .translate( null, executionContext.getQueryOptions() ); + ) ) + ); + temporaryTableIdentitySelect = + sqlAstTranslatorFactory.buildSelectTranslator( getSessionFactory(), selectStatement ) + .translate( null, executionContext.getQueryOptions() ); temporaryTableIdUpdate = null; temporaryTableRowNumberSelectSql = null; @@ -616,8 +604,8 @@ private RootTableInserter createRootTableInserter( // to then insert into the target tables in once statement if ( insertStatement.getTargetColumns().stream() .noneMatch( c -> keyColumns[0].equals( c.getColumnExpression() ) ) ) { - final EntityIdentifierMapping identifierMapping = getEntityDescriptor().getIdentifierMapping(); - final List primaryKeyTableColumns = + final var identifierMapping = getEntityDescriptor().getIdentifierMapping(); + final var primaryKeyTableColumns = getPrimaryKeyTableColumns( getEntityDescriptor(), entityTable ); final TemporaryTableColumn sessionUidColumn; @@ -641,18 +629,18 @@ private RootTableInserter createRootTableInserter( ); } if ( needsIdentifierGeneration( generator, assignsId ) ) { - final BasicEntityIdentifierMapping basicIdentifierMapping = (BasicEntityIdentifierMapping) identifierMapping; - final JdbcParameter rootIdentity = new SqlTypedMappingJdbcParameter( basicIdentifierMapping ); + final var basicIdentifierMapping = (BasicEntityIdentifierMapping) identifierMapping; + final var rootIdentity = new SqlTypedMappingJdbcParameter( basicIdentifierMapping ); final List temporaryTableAssignments = new ArrayList<>( 1 ); - final ColumnReference idColumnReference = new ColumnReference( (String) null, basicIdentifierMapping ); + final var idColumnReference = new ColumnReference( (String) null, basicIdentifierMapping ); temporaryTableAssignments.add( new Assignment( idColumnReference, rootIdentity ) ); final int rowNumberIndex = entityTable.getColumns().size() - (entityTable.getSessionUidColumn() == null ? 1 : 2); - final TemporaryTableColumn rowNumberColumn = entityTable.getColumns().get( rowNumberIndex ); - final JdbcParameter rowNumber = new SqlTypedMappingJdbcParameter( rowNumberColumn ); + final var rowNumberColumn = entityTable.getColumns().get( rowNumberIndex ); + final var rowNumber = new SqlTypedMappingJdbcParameter( rowNumberColumn ); - final UpdateStatement updateStatement = new UpdateStatement( + final var updateStatement = new UpdateStatement( temporaryTableReference, temporaryTableAssignments, Predicate.combinePredicates( @@ -671,14 +659,11 @@ private RootTableInserter createRootTableInserter( ) ); - temporaryTableIdUpdate = jdbcServices.getJdbcEnvironment() - .getSqlAstTranslatorFactory() - .buildMutationTranslator( getSessionFactory(), updateStatement ) - .translate( null, executionContext.getQueryOptions() ); - temporaryTableRowNumberSelectSql = ExecuteWithTemporaryTableHelper.createInsertedRowNumbersSelectSql( - entityTable, - executionContext - ); + temporaryTableIdUpdate = + sqlAstTranslatorFactory.buildMutationTranslator( getSessionFactory(), updateStatement ) + .translate( null, executionContext.getQueryOptions() ); + temporaryTableRowNumberSelectSql = + createInsertedRowNumbersSelectSql( entityTable, executionContext ); } else { temporaryTableIdUpdate = null; @@ -714,7 +699,7 @@ private RootTableInserter createRootTableInserter( } } if ( entityTable.getSessionUidColumn() != null ) { - final TemporaryTableColumn sessionUidColumn = entityTable.getSessionUidColumn(); + final var sessionUidColumn = entityTable.getSessionUidColumn(); querySpec.applyPredicate( new ComparisonPredicate( new ColumnReference( temporaryTableReference, @@ -728,26 +713,26 @@ private RootTableInserter createRootTableInserter( ) ); } - rootTableInsert = jdbcServices.getJdbcEnvironment() - .getSqlAstTranslatorFactory() - .buildMutationTranslator( getSessionFactory(), insertStatement ) - .translate( null, executionContext.getQueryOptions() ); + rootTableInsert = + sqlAstTranslatorFactory.buildMutationTranslator( getSessionFactory(), insertStatement ) + .translate( null, executionContext.getQueryOptions() ); if ( !assignsId && generator.generatedOnExecution() ) { - final GeneratedValuesMutationDelegate insertDelegate = getEntityDescriptor().getInsertDelegate(); + final var insertDelegate = getEntityDescriptor().getInsertDelegate(); // todo 7.0 : InsertGeneratedIdentifierDelegate will be removed once we're going to handle // generated values within the jdbc insert operaetion itself - final InsertGeneratedIdentifierDelegate identifierDelegate = (InsertGeneratedIdentifierDelegate) insertDelegate; + final var identifierDelegate = (InsertGeneratedIdentifierDelegate) insertDelegate; rootTableInsertWithReturningSql = identifierDelegate.prepareIdentifierGeneratingInsert( rootTableInsert.getSqlString() ); - final BasicEntityIdentifierMapping identifierMapping = - (BasicEntityIdentifierMapping) getEntityDescriptor().getIdentifierMapping(); + final var identifierMapping = + (BasicEntityIdentifierMapping) + getEntityDescriptor().getIdentifierMapping(); - final List primaryKeyTableColumns = + final var primaryKeyTableColumns = getPrimaryKeyTableColumns( getEntityDescriptor(), entityTable ); assert primaryKeyTableColumns.size() == 1; - final JdbcParameter entityIdentity = new SqlTypedMappingJdbcParameter( identifierMapping ); - final JdbcParameter rootIdentity = new SqlTypedMappingJdbcParameter( identifierMapping ); + final var entityIdentity = new SqlTypedMappingJdbcParameter( identifierMapping ); + final var rootIdentity = new SqlTypedMappingJdbcParameter( identifierMapping ); final List temporaryTableAssignments = new ArrayList<>( 1 ); temporaryTableAssignments.add( new Assignment( @@ -761,7 +746,7 @@ private RootTableInserter createRootTableInserter( rootIdentity ) ); - final UpdateStatement updateStatement = new UpdateStatement( + final var updateStatement = new UpdateStatement( temporaryTableReference, temporaryTableAssignments, new ComparisonPredicate( @@ -777,10 +762,9 @@ private RootTableInserter createRootTableInserter( ) ); - temporaryTableIdentityUpdate = jdbcServices.getJdbcEnvironment() - .getSqlAstTranslatorFactory() - .buildMutationTranslator( getSessionFactory(), updateStatement ) - .translate( null, executionContext.getQueryOptions() ); + temporaryTableIdentityUpdate = + sqlAstTranslatorFactory.buildMutationTranslator( getSessionFactory(), updateStatement ) + .translate( null, executionContext.getQueryOptions() ); } else { rootTableInsertWithReturningSql = null; @@ -797,15 +781,14 @@ private RootTableInserter createRootTableInserter( } private boolean needsIdentifierGeneration(Generator identifierGenerator, boolean assignsId) { - if ( !assignsId && identifierGenerator instanceof OptimizableGenerator ) { + if ( !assignsId && identifierGenerator instanceof OptimizableGenerator optimizableGenerator ) { // If the generator uses an optimizer or is not bulk insertion capable, // we have to generate identifiers for the new rows, as that couldn't // have been done via a SQL expression - final Optimizer optimizer = ( (OptimizableGenerator) identifierGenerator ).getOptimizer(); + final var optimizer = optimizableGenerator.getOptimizer(); return optimizer != null && optimizer.getIncrementSize() > 1 - || identifierGenerator instanceof BulkInsertionCapableIdentifierGenerator - && !( (BulkInsertionCapableIdentifierGenerator) identifierGenerator ) - .supportsBulkInsertionIdentifierGeneration(); + || identifierGenerator instanceof BulkInsertionCapableIdentifierGenerator bulkInsertionCapable + && !bulkInsertionCapable.supportsBulkInsertionIdentifierGeneration(); } else { return false; @@ -820,38 +803,38 @@ private JdbcOperationQueryMutation createTableInsert( boolean nullableTable, Map> assignmentsByTable, ExecutionContext executionContext) { - final TableReference updatingTableReference = updatingTableGroup.getTableReference( + final var updatingTableReference = updatingTableGroup.getTableReference( updatingTableGroup.getNavigablePath(), tableExpression, true ); - final List assignments = assignmentsByTable.get( tableExpression ); + final var assignments = assignmentsByTable.get( tableExpression ); if ( nullableTable && ( assignments == null || assignments.isEmpty() ) ) { // no assignments for this table - skip it return null; } - final NamedTableReference dmlTargetTableReference = resolveUnionTableReference( updatingTableReference, tableExpression ); + final var dmlTargetTableReference = + resolveUnionTableReference( updatingTableReference, tableExpression ); - final QuerySpec querySpec = new QuerySpec( true ); - final NamedTableReference temporaryTableReference = new NamedTableReference( + final var querySpec = new QuerySpec( true ); + final var temporaryTableReference = new NamedTableReference( translatedInsertStatement.getTargetTable().getTableExpression(), "hte_tmp" ); - final TableGroupImpl temporaryTableGroup = new TableGroupImpl( + final var temporaryTableGroup = new TableGroupImpl( updatingTableGroup.getNavigablePath(), null, temporaryTableReference, getEntityDescriptor() ); querySpec.getFromClause().addRoot( temporaryTableGroup ); - final InsertSelectStatement insertStatement = new InsertSelectStatement( dmlTargetTableReference ); + final var insertStatement = new InsertSelectStatement( dmlTargetTableReference ); insertStatement.setSourceSelectStatement( querySpec ); - applyAssignments( assignments, insertStatement, temporaryTableReference, getEntityDescriptor() ); - if ( insertStatement.getTargetColumns() - .stream() - .noneMatch( c -> keyColumns[0].equals( c.getColumnExpression() ) ) ) { - final List primaryKeyTableColumns = + applyAssignments( assignments, insertStatement, temporaryTableReference ); + if ( insertStatement.getTargetColumns().stream() + .noneMatch( column -> keyColumns[0].equals( column.getColumnExpression() ) ) ) { + final var primaryKeyTableColumns = getPrimaryKeyTableColumns( getEntityDescriptor().getEntityPersister(), entityTable ); getEntityDescriptor().getIdentifierMapping().forEachSelectable( 0, (selectionIndex, selectableMapping) -> { insertStatement.addTargetColumnReferences( @@ -878,7 +861,7 @@ private JdbcOperationQueryMutation createTableInsert( } if ( entityTable.getSessionUidColumn() != null ) { - final TemporaryTableColumn sessionUidColumn = entityTable.getSessionUidColumn(); + final var sessionUidColumn = entityTable.getSessionUidColumn(); querySpec.applyPredicate( new ComparisonPredicate( new ColumnReference( temporaryTableReference, @@ -891,9 +874,8 @@ private JdbcOperationQueryMutation createTableInsert( sessionUidParameter ) ); } - final JdbcServices jdbcServices = getSessionFactory().getJdbcServices(); - return jdbcServices.getJdbcEnvironment() - .getSqlAstTranslatorFactory() + return getSessionFactory().getJdbcServices() + .getJdbcEnvironment().getSqlAstTranslatorFactory() .buildMutationTranslator( getSessionFactory(), insertStatement ) .translate( null, executionContext.getQueryOptions() ); } @@ -905,18 +887,22 @@ private List getPrimaryKeyTableColumns(EntityPersister ent return entityTable.getColumns().subList( startIndex, endIndex ); } - private void applyAssignments(List assignments, InsertSelectStatement insertStatement, NamedTableReference temporaryTableReference, EntityPersister entityDescriptor) { + private void applyAssignments( + List assignments, + InsertSelectStatement insertStatement, + NamedTableReference temporaryTableReference) { if ( assignments != null && !assignments.isEmpty() ) { - for ( Assignment assignment : assignments ) { - final Assignable assignable = assignment.getAssignable(); + for ( var assignment : assignments ) { + final var assignable = assignment.getAssignable(); insertStatement.addTargetColumnReferences( assignable.getColumnReferences() ); - final List columns = entityTable.findTemporaryTableColumns( + final var columns = entityTable.findTemporaryTableColumns( getEntityDescriptor().getEntityPersister(), - ((SqmPathInterpretation) assignable).getExpressionType() + ( (SqmPathInterpretation) assignable ).getExpressionType() ); - for ( TemporaryTableColumn temporaryTableColumn : columns ) { - insertStatement.getSourceSelectStatement().getFirstQuerySpec().getSelectClause().addSqlSelection( - new SqlSelectionImpl( + for ( var temporaryTableColumn : columns ) { + insertStatement.getSourceSelectStatement() + .getFirstQuerySpec().getSelectClause() + .addSqlSelection( new SqlSelectionImpl( new ColumnReference( temporaryTableReference.getIdentificationVariable(), temporaryTableColumn.getColumnName(), @@ -924,8 +910,7 @@ private void applyAssignments(List assignments, InsertSelectStatemen null, temporaryTableColumn.getJdbcMapping() ) - ) - ); + ) ); } } } @@ -933,7 +918,7 @@ private void applyAssignments(List assignments, InsertSelectStatemen @Override public JdbcParameterBindings createJdbcParameterBindings(DomainQueryExecutionContext context) { - final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( + final var jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( context.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, @@ -947,13 +932,9 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter getSqmInsertStatement() { @Override public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecutionContext context) { if ( LOG.isTraceEnabled() ) { - LOG.tracef( - "Starting multi-table insert execution - %s", - getSqmStatement().getTarget().getModel().getName() - ); + LOG.tracef( "Starting multi-table insert execution - " + + getSqmStatement().getTarget().getModel().getName() ); } - final SqmJdbcExecutionContextAdapter executionContext = SqmJdbcExecutionContextAdapter.omittingLockingAndPaging( context ); + final var executionContext = omittingLockingAndPaging( context ); // NOTE: we could get rid of using a temporary table if the expressions in Values are "stable". // But that is a non-trivial optimization that requires more effort // as we need to split out individual inserts if we have a non-bulk capable optimizer - final boolean createdTable = ExecuteWithTemporaryTableHelper.performBeforeTemporaryTableUseActions( - entityTable, - temporaryTableStrategy, - executionContext - ); - + final boolean createdTable = + performBeforeTemporaryTableUseActions( + entityTable, + temporaryTableStrategy, + executionContext + ); try { - final int rows = ExecuteWithTemporaryTableHelper.saveIntoTemporaryTable( - temporaryTableInsert.jdbcOperation(), - jdbcParameterBindings, - executionContext - ); - + final int rows = + saveIntoTemporaryTable( temporaryTableInsert.jdbcOperation(), + jdbcParameterBindings, executionContext ); if ( rows != 0 ) { - final JdbcParameterBindings sessionUidBindings = new JdbcParameterBindingsImpl( 1 ); + final var sessionUidBindings = new JdbcParameterBindingsImpl( 1 ); if ( sessionUidParameter != null ) { sessionUidBindings.addBinding( sessionUidParameter, @@ -1084,14 +1061,15 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu ); } - final int insertedRows = insertRootTable( - rows, - createdTable, - sessionUidBindings, - executionContext - ); + final int insertedRows = + insertRootTable( + rows, + createdTable, + sessionUidBindings, + executionContext + ); - for ( JdbcOperationQueryMutation nonRootTableInsert : nonRootTableInserts ) { + for ( var nonRootTableInsert : nonRootTableInserts ) { insertTable( nonRootTableInsert, sessionUidBindings, @@ -1104,7 +1082,7 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu return rows; } finally { - ExecuteWithTemporaryTableHelper.performAfterTemporaryTableUseActions( + performAfterTemporaryTableUseActions( entityTable, sessionUidAccess, getAfterUseAction(), @@ -1118,16 +1096,16 @@ private int insertRootTable( boolean rowNumberStartsAtOne, JdbcParameterBindings sessionUidBindings, SqmJdbcExecutionContextAdapter executionContext) { - final EntityPersister entityPersister = getEntityDescriptor().getEntityPersister(); - final Generator generator = entityPersister.getGenerator(); - final EntityIdentifierMapping identifierMapping = entityPersister.getIdentifierMapping(); + final var entityPersister = getEntityDescriptor().getEntityPersister(); + final var generator = entityPersister.getGenerator(); + final var identifierMapping = entityPersister.getIdentifierMapping(); - final SharedSessionContractImplementor session = executionContext.getSession(); - final JdbcServices jdbcServices = session.getFactory().getJdbcServices(); + final var session = executionContext.getSession(); + final var jdbcServices = session.getFactory().getJdbcServices(); final Map entityTableToRootIdentity; if ( rootTableInserter.temporaryTableIdentitySelect != null ) { - final List list = jdbcServices.getJdbcSelectExecutor().list( + final var list = jdbcServices.getJdbcSelectExecutor().list( rootTableInserter.temporaryTableIdentitySelect, sessionUidBindings, executionContext, @@ -1137,21 +1115,17 @@ private int insertRootTable( rows ); entityTableToRootIdentity = new LinkedHashMap<>( list.size() ); - for ( Object o : list ) { - entityTableToRootIdentity.put( o, null ); + for ( Object object : list ) { + entityTableToRootIdentity.put( object, null ); } } else { entityTableToRootIdentity = null; if ( rootTableInserter.temporaryTableIdUpdate != null ) { - final BeforeExecutionGenerator beforeExecutionGenerator = (BeforeExecutionGenerator) generator; - final IntStream rowNumberStream = !rowNumberStartsAtOne - ? IntStream.of( ExecuteWithTemporaryTableHelper.loadInsertedRowNumbers( - rootTableInserter.temporaryTableRowNumberSelectSql, entityTable, sessionUidAccess, rows, - executionContext ) ) - : IntStream.range( 1, rows + 1 ); - final JdbcParameterBindings updateBindings = new JdbcParameterBindingsImpl( 3 ); + final var beforeExecutionGenerator = (BeforeExecutionGenerator) generator; + final var rowNumberStream = rowNumberStream( rows, rowNumberStartsAtOne, executionContext ); + final var updateBindings = new JdbcParameterBindingsImpl( 3 ); if ( sessionUidParameter != null ) { updateBindings.addBinding( sessionUidParameter, @@ -1161,10 +1135,10 @@ private int insertRootTable( ) ); } - final List parameterBinders = rootTableInserter.temporaryTableIdUpdate.getParameterBinders(); - final JdbcParameter rootIdentity = (JdbcParameter) parameterBinders.get( 0 ); - final JdbcParameter rowNumber = (JdbcParameter) parameterBinders.get( 1 ); - final BasicEntityIdentifierMapping basicIdentifierMapping = (BasicEntityIdentifierMapping) identifierMapping; + final var parameterBinders = rootTableInserter.temporaryTableIdUpdate.getParameterBinders(); + final var rootIdentity = (JdbcParameter) parameterBinders.get( 0 ); + final var rowNumber = (JdbcParameter) parameterBinders.get( 1 ); + final var basicIdentifierMapping = (BasicEntityIdentifierMapping) identifierMapping; rowNumberStream.forEach( rowNumberValue -> { updateBindings.addBinding( rowNumber, @@ -1183,12 +1157,9 @@ private int insertRootTable( final int updateCount = jdbcServices.getJdbcMutationExecutor().execute( rootTableInserter.temporaryTableIdUpdate, updateBindings, - sql -> session - .getJdbcCoordinator() - .getStatementPreparer() + sql -> session.getJdbcCoordinator().getStatementPreparer() .prepareStatement( sql ), - (integer, preparedStatement) -> { - }, + (integer, preparedStatement) -> {}, executionContext ); assert updateCount == 1; @@ -1197,14 +1168,14 @@ private int insertRootTable( } if ( rootTableInserter.rootTableInsertWithReturningSql != null ) { - final GeneratedValuesMutationDelegate insertDelegate = entityPersister.getEntityPersister().getInsertDelegate(); - final BasicEntityIdentifierMapping basicIdentifierMapping = (BasicEntityIdentifierMapping) identifierMapping; + final var insertDelegate = entityPersister.getEntityPersister().getInsertDelegate(); + final var basicIdentifierMapping = (BasicEntityIdentifierMapping) identifierMapping; // todo 7.0 : InsertGeneratedIdentifierDelegate will be removed once we're going to handle // generated values within the jdbc insert operaetion itself - final InsertGeneratedIdentifierDelegate identifierDelegate = (InsertGeneratedIdentifierDelegate) insertDelegate; - final ValueBinder jdbcValueBinder = basicIdentifierMapping.getJdbcMapping().getJdbcValueBinder(); - for ( Map.Entry entry : entityTableToRootIdentity.entrySet() ) { - final GeneratedValues generatedValues = identifierDelegate.performInsertReturning( + final var identifierDelegate = (InsertGeneratedIdentifierDelegate) insertDelegate; + final var jdbcValueBinder = basicIdentifierMapping.getJdbcMapping().getJdbcValueBinder(); + for ( var entry : entityTableToRootIdentity.entrySet() ) { + final var generatedValues = identifierDelegate.performInsertReturning( rootTableInserter.rootTableInsertWithReturningSql, session, new Binder() { @@ -1230,62 +1201,65 @@ public Object getEntity() { final Object rootIdentity = generatedValues.getGeneratedValue( identifierMapping ); entry.setValue( rootIdentity ); } - final JdbcParameterBindings updateBindings = new JdbcParameterBindingsImpl( 2 ); - - final List parameterBinders = rootTableInserter.temporaryTableIdentityUpdate.getParameterBinders(); - final JdbcParameter rootIdentity = (JdbcParameter) parameterBinders.get( 0 ); - final JdbcParameter entityIdentity = (JdbcParameter) parameterBinders.get( 1 ); - for ( Map.Entry entry : entityTableToRootIdentity.entrySet() ) { - JdbcMapping jdbcMapping = basicIdentifierMapping.getJdbcMapping(); - updateBindings.addBinding( entityIdentity, new JdbcParameterBindingImpl( jdbcMapping, entry.getKey() ) ); - updateBindings.addBinding( rootIdentity, new JdbcParameterBindingImpl( jdbcMapping, entry.getValue() ) ); + final var updateBindings = new JdbcParameterBindingsImpl( 2 ); + final var parameterBinders = rootTableInserter.temporaryTableIdentityUpdate.getParameterBinders(); + final var rootIdentity = (JdbcParameter) parameterBinders.get( 0 ); + final var entityIdentity = (JdbcParameter) parameterBinders.get( 1 ); + for ( var entry : entityTableToRootIdentity.entrySet() ) { + final var jdbcMapping = basicIdentifierMapping.getJdbcMapping(); + updateBindings.addBinding( entityIdentity, + new JdbcParameterBindingImpl( jdbcMapping, entry.getKey() ) ); + updateBindings.addBinding( rootIdentity, + new JdbcParameterBindingImpl( jdbcMapping, entry.getValue() ) ); jdbcServices.getJdbcMutationExecutor().execute( rootTableInserter.temporaryTableIdentityUpdate, updateBindings, - sql -> session - .getJdbcCoordinator() - .getStatementPreparer() + sql -> session.getJdbcCoordinator().getStatementPreparer() .prepareStatement( sql ), - (integer, preparedStatement) -> { - }, + (integer, preparedStatement) -> {}, executionContext ); } - return entityTableToRootIdentity.size(); } else { return jdbcServices.getJdbcMutationExecutor().execute( rootTableInserter.rootTableInsert, sessionUidBindings, - sql -> session - .getJdbcCoordinator() - .getStatementPreparer() + sql -> session.getJdbcCoordinator().getStatementPreparer() .prepareStatement( sql ), - (integer, preparedStatement) -> { - }, + (integer, preparedStatement) -> {}, executionContext ); } } + private IntStream rowNumberStream( + int rows, boolean rowNumberStartsAtOne, + SqmJdbcExecutionContextAdapter executionContext) { + return !rowNumberStartsAtOne + ? IntStream.of( loadInsertedRowNumbers( + rootTableInserter.temporaryTableRowNumberSelectSql, + entityTable, sessionUidAccess, rows, executionContext + ) ) + : IntStream.range( 1, rows + 1 ); + } + private void insertTable( JdbcOperationQueryMutation nonRootTableInsert, JdbcParameterBindings sessionUidBindings, ExecutionContext executionContext) { - final SharedSessionContractImplementor session = executionContext.getSession(); - final JdbcServices jdbcServices = session.getFactory().getJdbcServices(); - jdbcServices.getJdbcMutationExecutor().execute( - nonRootTableInsert, - sessionUidBindings, - sql -> executionContext.getSession() - .getJdbcCoordinator() - .getStatementPreparer() - .prepareStatement( sql ), - (integer, preparedStatement) -> { - }, - executionContext - ); + executionContext.getSession().getFactory().getJdbcServices() + .getJdbcMutationExecutor().execute( + nonRootTableInsert, + sessionUidBindings, + sql -> executionContext.getSession() + .getJdbcCoordinator() + .getStatementPreparer() + .prepareStatement( sql ), + (integer, preparedStatement) -> {}, + executionContext + ); } // For Hibernate Reactive diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedSoftDeleteHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedSoftDeleteHandler.java index b78441d3779c..ea2670cfaafb 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedSoftDeleteHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedSoftDeleteHandler.java @@ -6,16 +6,11 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.dialect.temptable.TemporaryTable; -import org.hibernate.dialect.temptable.TemporaryTableSessionUidColumn; import org.hibernate.dialect.temptable.TemporaryTableStrategy; -import org.hibernate.engine.jdbc.spi.JdbcServices; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.MutableObject; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.MappingModelExpressible; -import org.hibernate.metamodel.mapping.TableDetails; -import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.spi.DomainQueryExecutionContext; import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryParameterImplementor; @@ -39,15 +34,12 @@ import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.ast.tree.insert.InsertSelectStatement; import org.hibernate.sql.ast.tree.predicate.InSubQueryPredicate; -import org.hibernate.sql.ast.tree.predicate.Predicate; import org.hibernate.sql.ast.tree.predicate.PredicateCollector; import org.hibernate.sql.ast.tree.select.QuerySpec; -import org.hibernate.sql.ast.tree.update.Assignment; import org.hibernate.sql.ast.tree.update.UpdateStatement; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; -import org.hibernate.sql.exec.spi.JdbcMutationExecutor; import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParametersList; @@ -62,6 +54,11 @@ import static java.util.Collections.singletonList; import static org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter.omittingLockingAndPaging; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.createIdTableSelectQuerySpec; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.createMatchingIdsIntoIdTableInsert; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.performAfterTemporaryTableUseActions; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.performBeforeTemporaryTableUseActions; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.saveIntoTemporaryTable; /** * @author Steve Ebersole @@ -100,15 +97,13 @@ public TableBasedSoftDeleteHandler( this.sessionUidAccess = sessionUidAccess; - final TemporaryTableSessionUidColumn sessionUidColumn = idTable.getSessionUidColumn(); - if ( sessionUidColumn == null ) { - this.sessionUidParameter = null; - } - else { - this.sessionUidParameter = new SqlTypedMappingJdbcParameter( sessionUidColumn ); - } + final var sessionUidColumn = idTable.getSessionUidColumn(); + this.sessionUidParameter = + sessionUidColumn == null + ? null + : new SqlTypedMappingJdbcParameter( sessionUidColumn ); - final MultiTableSqmMutationConverter converter = new MultiTableSqmMutationConverter( + final var converter = new MultiTableSqmMutationConverter( getEntityDescriptor(), sqmDelete, sqmDelete.getTarget(), @@ -120,55 +115,57 @@ public TableBasedSoftDeleteHandler( ); - final String targetEntityName = sqmDelete.getTarget().getEntityName(); - final EntityPersister targetEntityDescriptor = + final var targetEntityDescriptor = getSessionFactory().getMappingMetamodel() - .getEntityDescriptor( targetEntityName ); + .getEntityDescriptor( sqmDelete.getTarget().getEntityName() ); - final EntityMappingType rootEntityDescriptor = targetEntityDescriptor.getRootEntityDescriptor(); + final var rootEntityDescriptor = targetEntityDescriptor.getRootEntityDescriptor(); // determine if we need to use a sub-query for matching ids - // 1. if the target is not the root we will // 2. if the supplied predicate (if any) refers to columns from a table // other than the identifier table we will - final SqmJdbcExecutionContextAdapter executionContext = omittingLockingAndPaging( context ); - - final TableGroup deletingTableGroup = converter.getMutatingTableGroup(); - final TableDetails softDeleteTable = rootEntityDescriptor.getSoftDeleteTableDetails(); - final NamedTableReference rootTableReference = (NamedTableReference) deletingTableGroup.resolveTableReference( - deletingTableGroup.getNavigablePath(), - softDeleteTable.getTableName() - ); + final var executionContext = omittingLockingAndPaging( context ); + + final var deletingTableGroup = converter.getMutatingTableGroup(); + final var softDeleteTable = rootEntityDescriptor.getSoftDeleteTableDetails(); + final var rootTableReference = + (NamedTableReference) + deletingTableGroup.resolveTableReference( + deletingTableGroup.getNavigablePath(), + softDeleteTable.getTableName() + ); assert rootTableReference != null; - // NOTE : `converter.visitWhereClause` already applies the soft-delete restriction - final Predicate specifiedRestriction = converter.visitWhereClause( sqmDelete.getWhereClause() ); + // NOTE: `converter.visitWhereClause` already applies the soft-delete restriction + final var specifiedRestriction = converter.visitWhereClause( sqmDelete.getWhereClause() ); - final PredicateCollector predicateCollector = new PredicateCollector( specifiedRestriction ); + final var predicateCollector = new PredicateCollector( specifiedRestriction ); targetEntityDescriptor.applyBaseRestrictions( predicateCollector, deletingTableGroup, true, - executionContext.getSession().getLoadQueryInfluencers().getEnabledFilters(), + executionContext.getSession() + .getLoadQueryInfluencers().getEnabledFilters(), false, null, converter ); converter.pruneTableGroupJoins(); - final ColumnReferenceCheckingSqlAstWalker walker = new ColumnReferenceCheckingSqlAstWalker( - rootTableReference.getIdentificationVariable() - ); - if ( predicateCollector.getPredicate() != null ) { - predicateCollector.getPredicate().accept( walker ); + final var walker = + new ColumnReferenceCheckingSqlAstWalker( + rootTableReference.getIdentificationVariable() ); + final var predicate = predicateCollector.getPredicate(); + if ( predicate != null ) { + predicate.accept( walker ); } - this.domainParameterXref = domainParameterXref; this.jdbcParamsXref = SqmUtil.generateJdbcParamsXref( domainParameterXref, converter ); this.resolvedParameterMappingModelTypes = converter.getSqmParameterMappingModelExpressibleResolutions(); - final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( + final var jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( context.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, @@ -181,19 +178,17 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter MappingModelExpressible getResolvedMappingModelType(SqmParameter MappingModelExpressible getResolvedMappingModelType(SqmParameter MappingModelExpressible getResolvedMappingModelType(SqmParameter idExpressions = new ArrayList<>( keyDetails.getColumnCount() ); - keyDetails.forEachKeyColumn( (position, column) -> idExpressions.add( - new ColumnReference( targetTableReference, column ) - ) ); - final Expression idExpression = idExpressions.size() == 1 + keyDetails.forEachKeyColumn( (position, column) -> + idExpressions.add( new ColumnReference( targetTableReference, column ) ) ); + return idExpressions.size() == 1 ? idExpressions.get( 0 ) - : new SqlTuple( idExpressions, rootEntityDescriptor.getIdentifierMapping() ); - return idExpression; + : new SqlTuple( idExpressions, + rootEntityDescriptor.getIdentifierMapping() ); } private JdbcOperationQueryMutation createDeleteWithSubQuery( @@ -289,13 +275,13 @@ private JdbcOperationQueryMutation createDeleteWithSubQuery( JdbcParameterBindings jdbcParameterBindings, MultiTableSqmMutationConverter converter, SqmJdbcExecutionContextAdapter executionContext) { - final QuerySpec matchingIdSubQuery = new QuerySpec( false, 1 ); + final var matchingIdSubQuery = new QuerySpec( false, 1 ); matchingIdSubQuery.getFromClause().addRoot( deletingTableGroup ); - final TableDetails identifierTableDetails = rootEntityDescriptor.getIdentifierTableDetails(); - final TableDetails.KeyDetails keyDetails = identifierTableDetails.getKeyDetails(); + final var identifierTableDetails = rootEntityDescriptor.getIdentifierTableDetails(); + final var keyDetails = identifierTableDetails.getKeyDetails(); - final NamedTableReference targetTable = new NamedTableReference( + final var targetTable = new NamedTableReference( identifierTableDetails.getTableName(), DeleteStatement.DEFAULT_ALIAS, false @@ -303,37 +289,30 @@ private JdbcOperationQueryMutation createDeleteWithSubQuery( final List idExpressions = new ArrayList<>( keyDetails.getColumnCount() ); keyDetails.forEachKeyColumn( (position, column) -> { - final Expression columnReference = converter.getSqlExpressionResolver().resolveSqlExpression( - rootTableReference, - column - ); - matchingIdSubQuery.getSelectClause().addSqlSelection( - new SqlSelectionImpl( position, columnReference ) - ); + final var columnReference = + converter.getSqlExpressionResolver() + .resolveSqlExpression( rootTableReference, column ); + matchingIdSubQuery.getSelectClause() + .addSqlSelection( new SqlSelectionImpl( position, columnReference ) ); idExpressions.add( new ColumnReference( targetTable, column ) ); } ); matchingIdSubQuery.applyPredicate( predicateCollector.getPredicate() ); - final Expression idExpression = idExpressions.size() == 1 - ? idExpressions.get( 0 ) - : new SqlTuple( idExpressions, rootEntityDescriptor.getIdentifierMapping() ); - - final Assignment softDeleteAssignment = rootEntityDescriptor - .getSoftDeleteMapping() - .createSoftDeleteAssignment( targetTable ); - - final UpdateStatement updateStatement = new UpdateStatement( - targetTable, - singletonList( softDeleteAssignment ), - new InSubQueryPredicate( idExpression, matchingIdSubQuery, false ) - ); + final var idExpression = + idExpressions.size() == 1 + ? idExpressions.get( 0 ) + : new SqlTuple( idExpressions, rootEntityDescriptor.getIdentifierMapping() ); - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); + final var softDeleteAssignment = + rootEntityDescriptor.getSoftDeleteMapping() + .createSoftDeleteAssignment( targetTable ); - final JdbcServices jdbcServices = factory.getJdbcServices(); + final var updateStatement = + new UpdateStatement( targetTable, singletonList( softDeleteAssignment ), + new InSubQueryPredicate( idExpression, matchingIdSubQuery, false ) ); - return jdbcServices.getJdbcEnvironment() - .getSqlAstTranslatorFactory() + final var factory = executionContext.getSession().getFactory(); + return factory.getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory() .buildMutationTranslator( factory, updateStatement ) .translate( jdbcParameterBindings, executionContext.getQueryOptions() ); } @@ -344,29 +323,23 @@ private JdbcOperationQueryMutation createDirectDelete( PredicateCollector predicateCollector, JdbcParameterBindings jdbcParameterBindings, SqmJdbcExecutionContextAdapter executionContext) { - final Assignment softDeleteAssignment = rootEntityDescriptor - .getSoftDeleteMapping() - .createSoftDeleteAssignment( rootTableReference ); - - final UpdateStatement updateStatement = new UpdateStatement( - rootTableReference, - singletonList( softDeleteAssignment ), - predicateCollector.getPredicate() - ); - - final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); + final var softDeleteAssignment = + rootEntityDescriptor.getSoftDeleteMapping() + .createSoftDeleteAssignment( rootTableReference ); - final JdbcServices jdbcServices = factory.getJdbcServices(); + final var updateStatement = + new UpdateStatement( rootTableReference, singletonList( softDeleteAssignment ), + predicateCollector.getPredicate() ); - return jdbcServices.getJdbcEnvironment() - .getSqlAstTranslatorFactory() + final var factory = executionContext.getSession().getFactory(); + return factory.getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory() .buildMutationTranslator( factory, updateStatement ) .translate( jdbcParameterBindings, executionContext.getQueryOptions() ); } @Override public JdbcParameterBindings createJdbcParameterBindings(DomainQueryExecutionContext context) { - final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( + final var jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( context.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, @@ -380,13 +353,9 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter executionContext.getSession() - .getJdbcCoordinator() - .getStatementPreparer() - .prepareStatement( sql ), + sql -> executionContext.getSession().getJdbcCoordinator() + .getStatementPreparer().prepareStatement( sql ), (integer, preparedStatement) -> {}, executionContext ); return rows; } finally { - ExecuteWithTemporaryTableHelper.performAfterTemporaryTableUseActions( + performAfterTemporaryTableUseActions( idTable, sessionUidAccess, getAfterUseAction(), @@ -473,10 +435,8 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu return jdbcMutationExecutor.execute( softDelete, jdbcParameterBindings, - sql -> executionContext.getSession() - .getJdbcCoordinator() - .getStatementPreparer() - .prepareStatement( sql ), + sql -> executionContext.getSession().getJdbcCoordinator() + .getStatementPreparer().prepareStatement( sql ), (integer, preparedStatement) -> {}, executionContext ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java index 32cb7f6423da..7a519977c268 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java @@ -6,14 +6,10 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.hibernate.dialect.temptable.TemporaryTable; -import org.hibernate.dialect.temptable.TemporaryTableSessionUidColumn; import org.hibernate.dialect.temptable.TemporaryTableStrategy; -import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.MutableObject; -import org.hibernate.internal.util.collections.CollectionHelper; -import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.mapping.MappingModelExpressible; import org.hibernate.metamodel.mapping.SelectableConsumer; import org.hibernate.metamodel.mapping.SoftDeleteMapping; @@ -26,7 +22,6 @@ import org.hibernate.query.sqm.ComparisonOperator; import org.hibernate.query.sqm.internal.CacheableSqmInterpretation; import org.hibernate.query.sqm.internal.DomainParameterXref; -import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter; import org.hibernate.query.sqm.internal.SqmUtil; import org.hibernate.query.sqm.mutation.internal.AbstractMutationHandler; import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter; @@ -78,6 +73,13 @@ import java.util.function.Supplier; import static org.hibernate.internal.util.collections.CollectionHelper.mapOfSize; +import static org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter.omittingLockingAndPaging; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.createIdTableSelectQuerySpec; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.createMatchingIdsIntoIdTableInsert; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.performAfterTemporaryTableUseActions; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.performBeforeTemporaryTableUseActions; +import static org.hibernate.query.sqm.mutation.internal.temptable.ExecuteWithTemporaryTableHelper.saveIntoTemporaryTable; +import static org.hibernate.sql.ast.tree.predicate.Predicate.combinePredicates; /** * @author Steve Ebersole @@ -114,24 +116,22 @@ public TableBasedUpdateHandler( this.forceDropAfterUse = forceDropAfterUse; this.sessionUidAccess = sessionUidAccess; - final TemporaryTableSessionUidColumn sessionUidColumn = idTable.getSessionUidColumn(); - if ( sessionUidColumn == null ) { - this.sessionUidParameter = null; - } - else { - this.sessionUidParameter = new SqlTypedMappingJdbcParameter( sessionUidColumn ); - } - final SessionFactoryImplementor sessionFactory = getSessionFactory(); - final MappingMetamodel domainModel = sessionFactory.getMappingMetamodel(); - final EntityPersister entityDescriptor = + final var sessionUidColumn = idTable.getSessionUidColumn(); + this.sessionUidParameter = + sessionUidColumn == null + ? null + : new SqlTypedMappingJdbcParameter( sessionUidColumn ); + final var sessionFactory = getSessionFactory(); + final var domainModel = sessionFactory.getMappingMetamodel(); + final var entityDescriptor = domainModel.getEntityDescriptor( sqmUpdate.getTarget().getEntityName() ); final String rootEntityName = entityDescriptor.getRootEntityName(); - final EntityPersister rootEntityDescriptor = domainModel.getEntityDescriptor( rootEntityName ); + final var rootEntityDescriptor = domainModel.getEntityDescriptor( rootEntityName ); final String hierarchyRootTableName = rootEntityDescriptor.getTableName(); - final MultiTableSqmMutationConverter converterDelegate = new MultiTableSqmMutationConverter( + final var converterDelegate = new MultiTableSqmMutationConverter( entityDescriptor, sqmUpdate, sqmUpdate.getTarget(), @@ -142,9 +142,9 @@ public TableBasedUpdateHandler( sessionFactory.getSqlTranslationEngine() ); - final TableGroup updatingTableGroup = converterDelegate.getMutatingTableGroup(); + final var updatingTableGroup = converterDelegate.getMutatingTableGroup(); - final TableReference hierarchyRootTableReference = updatingTableGroup.resolveTableReference( + final var hierarchyRootTableReference = updatingTableGroup.resolveTableReference( updatingTableGroup.getNavigablePath(), hierarchyRootTableName ); @@ -154,14 +154,14 @@ public TableBasedUpdateHandler( // visit the set-clause using our special converter, collecting // information about the assignments - final List assignments = converterDelegate.visitSetClause( sqmUpdate.getSetClause() ); + final var assignments = converterDelegate.visitSetClause( sqmUpdate.getSetClause() ); converterDelegate.addVersionedAssignment( assignments::add, sqmUpdate ); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // visit the where-clause using our special converter, collecting information // about the restrictions - final PredicateCollector predicateCollector = new PredicateCollector( + final var predicateCollector = new PredicateCollector( converterDelegate.visitWhereClause( sqmUpdate.getWhereClause() ) ); @@ -181,36 +181,26 @@ public TableBasedUpdateHandler( // cross-reference the TableReference by alias. The TableGroup already // cross-references it by name, bu the ColumnReference only has the alias - final Map tableReferenceByAlias = CollectionHelper.mapOfSize( updatingTableGroup.getTableReferenceJoins().size() + 1 ); + final Map tableReferenceByAlias = + mapOfSize( updatingTableGroup.getTableReferenceJoins().size() + 1 ); collectTableReference( updatingTableGroup.getPrimaryTableReference(), tableReferenceByAlias::put ); for ( int i = 0; i < updatingTableGroup.getTableReferenceJoins().size(); i++ ) { collectTableReference( updatingTableGroup.getTableReferenceJoins().get( i ), tableReferenceByAlias::put ); } - final SoftDeleteMapping softDeleteMapping = entityDescriptor.getSoftDeleteMapping(); - final Predicate suppliedPredicate; - if ( softDeleteMapping != null ) { - final NamedTableReference rootTableReference = (NamedTableReference) updatingTableGroup.resolveTableReference( - updatingTableGroup.getNavigablePath(), - entityDescriptor.getIdentifierTableDetails().getTableName() - ); - suppliedPredicate = Predicate.combinePredicates( - predicateCollector.getPredicate(), - softDeleteMapping.createNonDeletedRestriction( rootTableReference ) - ); - } - else { - suppliedPredicate = predicateCollector.getPredicate(); - } - - Map> assignmentsByTable = mapOfSize( updatingTableGroup.getTableReferenceJoins().size() + 1 ); + final var softDeleteMapping = entityDescriptor.getSoftDeleteMapping(); + final var suppliedPredicate = + suppliedPredicate( softDeleteMapping, updatingTableGroup, entityDescriptor, predicateCollector ); + final Map> assignmentsByTable = + mapOfSize( updatingTableGroup.getTableReferenceJoins().size() + 1 ); this.domainParameterXref = domainParameterXref; this.jdbcParamsXref = SqmUtil.generateJdbcParamsXref( domainParameterXref, converterDelegate ); - this.resolvedParameterMappingModelTypes = converterDelegate.getSqmParameterMappingModelExpressibleResolutions(); + this.resolvedParameterMappingModelTypes = + converterDelegate.getSqmParameterMappingModelExpressibleResolutions(); - final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( + final var jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( context.getQueryParameterBindings(), domainParameterXref, jdbcParamsXref, @@ -223,13 +213,9 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter MappingModelExpressible getResolvedMappingModelType(SqmParameter assignmentColumnRefs = assignment.getAssignable().getColumnReferences(); - + final var assignment = assignments.get( i ); + final var assignmentColumnRefs = assignment.getAssignable().getColumnReferences(); TableReference assignmentTableReference = null; - for ( int c = 0; c < assignmentColumnRefs.size(); c++ ) { - final ColumnReference columnReference = assignmentColumnRefs.get( c ); - final TableReference tableReference = resolveTableReference( - columnReference, - tableReferenceByAlias - ); - + final var columnReference = assignmentColumnRefs.get( c ); + final var tableReference = resolveTableReference( columnReference, tableReferenceByAlias ); if ( assignmentTableReference != null && assignmentTableReference != tableReference ) { - throw new SemanticException( "Assignment referred to columns from multiple tables: " + assignment.getAssignable() ); + throw new SemanticException( "Assignment referred to columns from multiple tables: " + + assignment.getAssignable() ); } - assignmentTableReference = tableReference; } - - List assignmentsForTable = assignmentsByTable.get( assignmentTableReference ); - if ( assignmentsForTable == null ) { - assignmentsForTable = new ArrayList<>(); - assignmentsByTable.put( assignmentTableReference, assignmentsForTable ); - } - assignmentsForTable.add( assignment ); + assignmentsByTable.computeIfAbsent( assignmentTableReference, k -> new ArrayList<>() ) + .add( assignment ); } - final SqmJdbcExecutionContextAdapter executionContext = SqmJdbcExecutionContextAdapter.omittingLockingAndPaging( context ); - this.matchingIdsIntoIdTableInsert = ExecuteWithTemporaryTableHelper.createMatchingIdsIntoIdTableInsert( + final var executionContext = omittingLockingAndPaging( context ); + this.matchingIdsIntoIdTableInsert = createMatchingIdsIntoIdTableInsert( converterDelegate, suppliedPredicate, idTable, @@ -274,7 +249,7 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter MappingModelExpressible getResolvedMappingModelType(SqmParameter MappingModelExpressible getResolvedMappingModelType(SqmParameter tableReferenceByAlias) { - final TableReference tableReferenceByQualifier = tableReferenceByAlias.get( columnReference.getQualifier() ); + final var tableReferenceByQualifier = + tableReferenceByAlias.get( columnReference.getQualifier() ); if ( tableReferenceByQualifier != null ) { return tableReferenceByQualifier; } @@ -395,24 +385,28 @@ private TableUpdater createTableUpdater( // set ... // where `keyExpression` in ( `idTableSubQuery` ) - final TableReference updatingTableReference = updatingTableGroup.getTableReference( + final var updatingTableReference = updatingTableGroup.getTableReference( updatingTableGroup.getNavigablePath(), tableExpression, true ); - final List assignments = assignmentsByTable.get( updatingTableReference ); + final var assignments = assignmentsByTable.get( updatingTableReference ); if ( assignments == null || assignments.isEmpty() ) { // no assignments for this table - skip it return null; } - final NamedTableReference dmlTableReference = resolveUnionTableReference( updatingTableReference, tableExpression ); - final JdbcServices jdbcServices = executionContext.getSession().getFactory().getJdbcServices(); - final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcServices.getJdbcEnvironment().getSqlAstTranslatorFactory(); + final var dmlTableReference = + resolveUnionTableReference( updatingTableReference, tableExpression ); + final var sqlAstTranslatorFactory = + executionContext.getSession().getFactory() + .getJdbcServices().getJdbcEnvironment() + .getSqlAstTranslatorFactory(); - final Expression keyExpression = - resolveMutatingTableKeyExpression( tableExpression, tableKeyColumnVisitationSupplier ); + final var keyExpression = + resolveMutatingTableKeyExpression( tableExpression, + tableKeyColumnVisitationSupplier ); return new TableUpdater( createTableUpdate( idTableSubQuery, @@ -438,7 +432,7 @@ private TableUpdater createTableUpdater( } protected boolean isTableOptional(String tableExpression) { - final EntityPersister entityPersister = getEntityDescriptor().getEntityPersister(); + final var entityPersister = getEntityDescriptor().getEntityPersister(); for ( int i = 0; i < entityPersister.getTableSpan(); i++ ) { if ( tableExpression.equals( entityPersister.getTableName( i ) ) && entityPersister.isNullableTable( i ) ) { @@ -459,7 +453,7 @@ private JdbcOperationQueryMutation createTableInsert( JdbcParameterBindings firstJdbcParameterBindings, ExecutionContext executionContext) { - final SessionFactoryImplementor sessionFactory = executionContext.getSession().getFactory(); + final var sessionFactory = executionContext.getSession().getFactory(); // Execute a query in the form - // // insert into (...) @@ -474,42 +468,46 @@ private JdbcOperationQueryMutation createTableInsert( // Create a new QuerySpec for the "insert source" select query. This // is mostly a copy of the incoming `idTableSubQuery` along with the // NOT-EXISTS predicate - final QuerySpec insertSourceSelectQuerySpec = makeInsertSourceSelectQuerySpec( idTableSubQuery ); + final var insertSourceSelectQuerySpec = makeInsertSourceSelectQuerySpec( idTableSubQuery ); // create the `select 1 ...` sub-query and apply the not-exists predicate - final QuerySpec existsSubQuerySpec = createExistsSubQuerySpec( targetTableExpression, tableKeyColumnVisitationSupplier, idTableSubQuery, sessionFactory ); insertSourceSelectQuerySpec.applyPredicate( new ExistsPredicate( - existsSubQuerySpec, + createExistsSubQuerySpec( + targetTableExpression, + tableKeyColumnVisitationSupplier, + idTableSubQuery, + sessionFactory + ), true, - sessionFactory.getTypeConfiguration().getBasicTypeForJavaType( Boolean.class ) + sessionFactory.getTypeConfiguration() + .getBasicTypeForJavaType( Boolean.class ) ) ); // Collect the target column references from the key expressions final List targetColumnReferences = new ArrayList<>(); - if ( targetTableKeyExpression instanceof SqlTuple ) { + if ( targetTableKeyExpression instanceof SqlTuple sqlTuple ) { + final var expressions = sqlTuple.getExpressions(); //noinspection unchecked - targetColumnReferences.addAll( (Collection) ( (SqlTuple) targetTableKeyExpression ).getExpressions() ); + targetColumnReferences.addAll( (Collection) expressions ); } else { targetColumnReferences.add( (ColumnReference) targetTableKeyExpression ); } // And transform assignments to target column references and selections - for ( Assignment assignment : assignments ) { + for ( var assignment : assignments ) { targetColumnReferences.addAll( assignment.getAssignable().getColumnReferences() ); - insertSourceSelectQuerySpec.getSelectClause().addSqlSelection( - new SqlSelectionImpl( assignment.getAssignedValue() ) - ); + insertSourceSelectQuerySpec.getSelectClause() + .addSqlSelection( new SqlSelectionImpl( assignment.getAssignedValue() ) ); } - final InsertSelectStatement insertSqlAst = new InsertSelectStatement( targetTableReference ); + final var insertSqlAst = new InsertSelectStatement( targetTableReference ); insertSqlAst.addTargetColumnReferences( targetColumnReferences.toArray( new ColumnReference[0] ) ); insertSqlAst.setSourceSelectStatement( insertSourceSelectQuerySpec ); - return sqlAstTranslatorFactory - .buildMutationTranslator( sessionFactory, insertSqlAst ) + return sqlAstTranslatorFactory.buildMutationTranslator( sessionFactory, insertSqlAst ) .translate( firstJdbcParameterBindings, executionContext.getQueryOptions() ); } @@ -518,29 +516,22 @@ protected QuerySpec createExistsSubQuerySpec( Supplier> tableKeyColumnVisitationSupplier, QuerySpec idTableSubQuery, SessionFactoryImplementor sessionFactory) { - final NamedTableReference existsTableReference = new NamedTableReference( - targetTableExpression, - "dml_" - ); + final var existsTableReference = + new NamedTableReference( targetTableExpression, "dml_" ); // Prepare a not exists sub-query to avoid violating constraints - final QuerySpec existsSubQuerySpec = new QuerySpec( false ); - existsSubQuerySpec.getSelectClause().addSqlSelection( - new SqlSelectionImpl( - new QueryLiteral<>( - 1, - sessionFactory.getTypeConfiguration().getBasicTypeForJavaType( Integer.class ) - ) - ) - ); - existsSubQuerySpec.getFromClause().addRoot( new TableGroupImpl( - null, - null, - existsTableReference, - getEntityDescriptor() - ) ); - - final TableKeyExpressionCollector existsKeyColumnCollector = new TableKeyExpressionCollector( getEntityDescriptor() ); + final var existsSubQuerySpec = new QuerySpec( false ); + existsSubQuerySpec.getSelectClause() + .addSqlSelection( new SqlSelectionImpl( + new QueryLiteral<>( 1, + sessionFactory.getTypeConfiguration() + .getBasicTypeForJavaType( Integer.class ) ) + ) ); + existsSubQuerySpec.getFromClause() + .addRoot( new TableGroupImpl( null, null, + existsTableReference, getEntityDescriptor() ) ); + + final var existsKeyColumnCollector = new TableKeyExpressionCollector( getEntityDescriptor() ); tableKeyColumnVisitationSupplier.get().accept( (columnIndex, selection) -> { assert selection.getContainingTableExpression().equals( targetTableExpression ); existsKeyColumnCollector.apply( new ColumnReference( existsTableReference, selection ) ); @@ -556,11 +547,13 @@ protected QuerySpec createExistsSubQuerySpec( } protected static QuerySpec makeInsertSourceSelectQuerySpec(QuerySpec idTableSubQuery) { - final QuerySpec idTableQuerySpec = new QuerySpec( true ); - for ( TableGroup root : idTableSubQuery.getFromClause().getRoots() ) { + final var idTableQuerySpec = new QuerySpec( true ); + final var fromClause = idTableSubQuery.getFromClause(); + for ( var root : fromClause.getRoots() ) { idTableQuerySpec.getFromClause().addRoot( root ); } - for ( SqlSelection sqlSelection : idTableSubQuery.getSelectClause().getSqlSelections() ) { + final var selectClause = idTableSubQuery.getSelectClause(); + for ( var sqlSelection : selectClause.getSqlSelections() ) { idTableQuerySpec.getSelectClause().addSqlSelection( sqlSelection ); } idTableQuerySpec.applyPredicate( idTableSubQuery.getWhereClauseRestrictions() ); @@ -575,27 +568,21 @@ private JdbcOperationQueryMutation createTableUpdate( SqlAstTranslatorFactory sqlAstTranslatorFactory, JdbcParameterBindings firstJdbcParameterBindings, Expression keyExpression) { - final UpdateStatement sqlAst = new UpdateStatement( - dmlTableReference, - assignments, - new InSubQueryPredicate( keyExpression, idTableSubQuery, false ) - ); - - return sqlAstTranslatorFactory - .buildMutationTranslator( executionContext.getSession().getFactory(), sqlAst ) + final var sqlAst = + new UpdateStatement( dmlTableReference, assignments, + new InSubQueryPredicate( keyExpression, idTableSubQuery, false ) ); + return sqlAstTranslatorFactory.buildMutationTranslator( executionContext.getSession().getFactory(), sqlAst ) .translate( firstJdbcParameterBindings, executionContext.getQueryOptions() ); } protected Expression resolveMutatingTableKeyExpression(String tableExpression, Supplier> tableKeyColumnVisitationSupplier) { - final TableKeyExpressionCollector keyColumnCollector = new TableKeyExpressionCollector( getEntityDescriptor() ); - + final var keyColumnCollector = new TableKeyExpressionCollector( getEntityDescriptor() ); tableKeyColumnVisitationSupplier.get().accept( (columnIndex, selection) -> { assert selection.getContainingTableExpression().equals( tableExpression ); keyColumnCollector.apply( new ColumnReference( (String) null, selection ) ); } ); - return keyColumnCollector.buildKeyExpression(); } @@ -605,7 +592,7 @@ protected Expression asExpression(SelectClause selectClause) { return sqlSelections.get( 0 ).getExpression(); } final List expressions = new ArrayList<>( sqlSelections.size() ); - for ( SqlSelection sqlSelection : sqlSelections ) { + for ( var sqlSelection : sqlSelections ) { expressions.add( sqlSelection.getExpression() ); } return new SqlTuple( expressions, null ); @@ -632,20 +619,20 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu ); } - final SqmJdbcExecutionContextAdapter executionContext = SqmJdbcExecutionContextAdapter.omittingLockingAndPaging( context ); - ExecuteWithTemporaryTableHelper.performBeforeTemporaryTableUseActions( + final var executionContext = omittingLockingAndPaging( context ); + performBeforeTemporaryTableUseActions( idTable, temporaryTableStrategy, executionContext ); try { - final int rows = ExecuteWithTemporaryTableHelper.saveIntoTemporaryTable( + final int rows = saveIntoTemporaryTable( matchingIdsIntoIdTableInsert.jdbcOperation(), jdbcParameterBindings, executionContext ); - for ( TableUpdater tableUpdater : tableUpdaters ) { + for ( var tableUpdater : tableUpdaters ) { updateTable( tableUpdater, rows, @@ -656,7 +643,7 @@ public int execute(JdbcParameterBindings jdbcParameterBindings, DomainQueryExecu return rows; } finally { - ExecuteWithTemporaryTableHelper.performAfterTemporaryTableUseActions( + performAfterTemporaryTableUseActions( idTable, sessionUidAccess, getAfterUseAction(), @@ -670,36 +657,31 @@ private void updateTable( int expectedUpdateCount, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext) { - if ( tableUpdater == null ) { - // no assignments for this table - skip it - return; - } - final int updateCount = executeMutation( tableUpdater.jdbcUpdate, jdbcParameterBindings, executionContext ); - - // We are done when the update count matches - if ( updateCount == expectedUpdateCount ) { - return; - } - - // If the table is optional, execute an insert - if ( tableUpdater.jdbcInsert != null ) { - final int insertCount = executeMutation( tableUpdater.jdbcInsert, jdbcParameterBindings, executionContext ); - assert insertCount + updateCount == expectedUpdateCount; + if ( tableUpdater != null ) { + final int updateCount = + executeMutation( tableUpdater.jdbcUpdate, jdbcParameterBindings, executionContext ); + if ( updateCount != expectedUpdateCount ) {// If the table is optional, execute an insert + if ( tableUpdater.jdbcInsert != null ) { + final int insertCount = + executeMutation( tableUpdater.jdbcInsert, jdbcParameterBindings, executionContext ); + assert insertCount + updateCount == expectedUpdateCount; + } + } + // Else we are done when the update count matches } + // Else no assignments for this table - skip it } private int executeMutation(JdbcOperationQueryMutation jdbcUpdate, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext) { - return executionContext.getSession().getFactory().getJdbcServices().getJdbcMutationExecutor().execute( - jdbcUpdate, - jdbcParameterBindings, - sql -> executionContext.getSession() - .getJdbcCoordinator() - .getStatementPreparer() - .prepareStatement( sql ), - (integer, preparedStatement) -> { - }, - executionContext - ); + return executionContext.getSession().getFactory().getJdbcServices() + .getJdbcMutationExecutor().execute( + jdbcUpdate, + jdbcParameterBindings, + sql -> executionContext.getSession().getJdbcCoordinator() + .getStatementPreparer().prepareStatement( sql ), + (integer, preparedStatement) -> {}, + executionContext + ); } protected record TableUpdater( diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleBasicValuedModelPart.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleBasicValuedModelPart.java index 598022ff7f5a..76bda76cf1f9 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleBasicValuedModelPart.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleBasicValuedModelPart.java @@ -326,7 +326,6 @@ public BasicFetch generateFetch( fetchablePath, this, fetchTiming, - creationState, !sqlSelection.isVirtual() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicFetch.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicFetch.java index 6d1bb339c8fa..99f5a11b2b25 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicFetch.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicFetch.java @@ -15,7 +15,6 @@ import org.hibernate.sql.results.graph.UnfetchedBasicPartResultAssembler; import org.hibernate.sql.results.graph.UnfetchedResultAssembler; import org.hibernate.sql.results.graph.DomainResultAssembler; -import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.Fetch; import org.hibernate.sql.results.graph.FetchParent; import org.hibernate.sql.results.graph.Fetchable; @@ -41,7 +40,6 @@ public BasicFetch( NavigablePath fetchablePath, BasicValuedModelPart valuedMapping, FetchTiming fetchTiming, - DomainResultCreationState creationState, boolean unwrapRowProcessingState) { //noinspection unchecked this( @@ -52,7 +50,6 @@ public BasicFetch( (BasicValueConverter) valuedMapping.getJdbcMapping().getValueConverter(), fetchTiming, true, - creationState, false, unwrapRowProcessingState ); @@ -66,7 +63,6 @@ public BasicFetch( BasicValueConverter valueConverter, FetchTiming fetchTiming, boolean canBasicPartFetchBeDelayed, - DomainResultCreationState creationState, boolean coerceResultType, boolean unwrapRowProcessingState) { this.navigablePath = fetchablePath; @@ -74,23 +70,18 @@ public BasicFetch( this.fetchParent = fetchParent; this.valuedMapping = valuedMapping; this.fetchTiming = fetchTiming; - @SuppressWarnings("unchecked") final JavaType javaType = (JavaType) valuedMapping.getJavaType(); + @SuppressWarnings("unchecked") + final var javaType = (JavaType) valuedMapping.getJavaType(); // lazy basic attribute if ( fetchTiming == FetchTiming.DELAYED && valuesArrayPosition == -1 ) { - if ( canBasicPartFetchBeDelayed ) { - this.assembler = new UnfetchedResultAssembler<>( javaType ); - } - else { - this.assembler = new UnfetchedBasicPartResultAssembler( javaType ); - } + this.assembler = canBasicPartFetchBeDelayed + ? new UnfetchedResultAssembler<>( javaType ) + : new UnfetchedBasicPartResultAssembler<>( javaType ); } else { - if (coerceResultType) { - this.assembler = new CoercingResultAssembler<>( valuesArrayPosition, javaType, valueConverter, unwrapRowProcessingState ); - } - else { - this.assembler = new BasicResultAssembler<>( valuesArrayPosition, javaType, valueConverter, unwrapRowProcessingState ); - } + this.assembler = coerceResultType + ? new CoercingResultAssembler<>( valuesArrayPosition, javaType, valueConverter, unwrapRowProcessingState ) + : new BasicResultAssembler<>( valuesArrayPosition, javaType, valueConverter, unwrapRowProcessingState ); } } @@ -146,8 +137,8 @@ public String getResultVariable() { @Override public void collectValueIndexesToCache(BitSet valueIndexes) { - if ( assembler instanceof BasicResultAssembler ) { - valueIndexes.set( ( (BasicResultAssembler) assembler ).valuesArrayPosition ); + if ( assembler instanceof BasicResultAssembler basicResultAssembler ) { + valueIndexes.set( basicResultAssembler.valuesArrayPosition ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicResultAssembler.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicResultAssembler.java index 6a6937281095..94a498c7cb36 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicResultAssembler.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicResultAssembler.java @@ -53,32 +53,33 @@ public Object extractRawValue(RowProcessingState rowProcessingState) { } @Override - public J assemble( - RowProcessingState rowProcessingState) { + public J assemble(RowProcessingState rowProcessingState) { final Object jdbcValue = extractRawValue( rowProcessingState ); if ( valueConverter != null ) { - if ( jdbcValue != null ) { - // the raw value type should be the converter's relational-JTD - if ( ! valueConverter.getRelationalJavaType().isInstance( jdbcValue ) ) { - throw new HibernateException( - String.format( - Locale.ROOT, - "Expecting raw JDBC value of type `%s`, but found `%s` : [%s]", - valueConverter.getRelationalJavaType().getTypeName(), - jdbcValue.getClass().getName(), - jdbcValue - ) - ); - } + if ( jdbcValue != null + // the raw value type should be the converter's relational-JTD + && !valueConverter.getRelationalJavaType().isInstance( jdbcValue ) ) { + throw new HibernateException( + String.format( + Locale.ROOT, + "Expecting raw JDBC value of type `%s`, but found `%s` : [%s]", + valueConverter.getRelationalJavaType().getTypeName(), + jdbcValue.getClass().getName(), + jdbcValue + ) + ); } - - //noinspection unchecked,rawtypes - return (J) ( (BasicValueConverter) valueConverter ).toDomainValue( jdbcValue ); + // Safe unchecked cast due to check above + @SuppressWarnings({"unchecked", "rawtypes"}) + final Object domainValue = + ( (BasicValueConverter) valueConverter ) + .toDomainValue( jdbcValue ); + return (J) domainValue; + } + else { + return (J) jdbcValue; } - - //noinspection unchecked - return (J) jdbcValue; } @Override @@ -88,10 +89,9 @@ public void resolveState(RowProcessingState rowProcessingState) { @Override public JavaType getAssembledJavaType() { - if ( valueConverter != null ) { - return valueConverter.getDomainJavaType(); - } - return assembledJavaType; + return valueConverter != null + ? valueConverter.getDomainJavaType() + : assembledJavaType; } /** diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableFetchImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableFetchImpl.java index c476a4d41622..d5509f2447f7 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableFetchImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableFetchImpl.java @@ -9,8 +9,6 @@ import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.SqlAstJoinType; -import org.hibernate.sql.ast.spi.SqlSelection; -import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.ast.tree.from.TableGroupJoin; import org.hibernate.sql.ast.tree.from.TableGroupProducer; @@ -87,9 +85,9 @@ public AggregateEmbeddableFetchImpl( final var sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); final var tableReference = tableGroup.getPrimaryTableReference(); final var selectableMapping = fetchContainer.getAggregateMapping(); - final Expression expression = sqlExpressionResolver.resolveSqlExpression( tableReference, selectableMapping ); + final var expression = sqlExpressionResolver.resolveSqlExpression( tableReference, selectableMapping ); final var typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); - final SqlSelection aggregateSelection = sqlExpressionResolver.resolveSqlSelection( + final var aggregateSelection = sqlExpressionResolver.resolveSqlSelection( expression, typeConfiguration.getJavaTypeRegistry().resolveDescriptor( Object[].class ), fetchParent, @@ -139,8 +137,8 @@ public Fetchable getFetchedMapping() { @Override public NavigablePath resolveNavigablePath(Fetchable fetchable) { if ( fetchable instanceof TableGroupProducer ) { - for ( TableGroupJoin tableGroupJoin : tableGroup.getTableGroupJoins() ) { - final NavigablePath navigablePath = tableGroupJoin.getNavigablePath(); + for ( var tableGroupJoin : tableGroup.getTableGroupJoins() ) { + final var navigablePath = tableGroupJoin.getNavigablePath(); if ( tableGroupJoin.getJoinedGroup().isFetched() && fetchable.getFetchableName().equals( navigablePath.getLocalName() ) && tableGroupJoin.getJoinedGroup().getModelPart() == fetchable @@ -173,7 +171,9 @@ public EmbeddableInitializer createInitializer( } @Override - public EmbeddableInitializer createInitializer(InitializerParent parent, AssemblerCreationState creationState) { + public EmbeddableInitializer createInitializer( + InitializerParent parent, + AssemblerCreationState creationState) { return new AggregateEmbeddableInitializerImpl( this, discriminatorFetch, diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableResultImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableResultImpl.java index e1c2087da229..d758683d3cd1 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableResultImpl.java @@ -4,21 +4,15 @@ */ package org.hibernate.sql.results.graph.embeddable.internal; -import org.hibernate.internal.util.NullnessUtil; import org.hibernate.metamodel.mapping.EmbeddableMappingType; import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.SqlAstJoinType; -import org.hibernate.sql.ast.spi.SqlSelection; -import org.hibernate.sql.ast.tree.expression.Expression; -import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableGroupJoin; import org.hibernate.sql.results.graph.AbstractFetchParent; import org.hibernate.sql.results.graph.AssemblerCreationState; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResultAssembler; import org.hibernate.sql.results.graph.DomainResultCreationState; -import org.hibernate.sql.results.graph.Fetch; import org.hibernate.sql.results.graph.FetchParent; import org.hibernate.sql.results.graph.Initializer; import org.hibernate.sql.results.graph.InitializerParent; @@ -29,6 +23,7 @@ import org.hibernate.sql.results.graph.internal.ImmutableFetchList; import org.hibernate.type.descriptor.java.JavaType; +import static org.hibernate.internal.util.NullnessUtil.castNonNull; import static org.hibernate.sql.results.graph.embeddable.AggregateEmbeddableResultGraphNode.determineAggregateValuesArrayPositions; /** @@ -63,15 +58,15 @@ public AggregateEmbeddableResultImpl( final var sqlAstCreationState = creationState.getSqlAstCreationState(); final var fromClauseAccess = sqlAstCreationState.getFromClauseAccess(); - final TableGroup tableGroup = fromClauseAccess.resolveTableGroup( + final var tableGroup = fromClauseAccess.resolveTableGroup( getNavigablePath(), np -> { - final EmbeddableValuedModelPart embeddedValueMapping = + final var embeddedValueMapping = embeddedPartDescriptor.getEmbeddableTypeDescriptor() .getEmbeddedValueMapping(); - final TableGroup tg = - fromClauseAccess.findTableGroup( NullnessUtil.castNonNull( np.getParent() ).getParent() ); - final TableGroupJoin tableGroupJoin = embeddedValueMapping.createTableGroupJoin( + final var tg = + fromClauseAccess.findTableGroup( castNonNull( np.getParent() ).getParent() ); + final var tableGroupJoin = embeddedValueMapping.createTableGroupJoin( np, tg, resultVariable, @@ -89,12 +84,13 @@ public AggregateEmbeddableResultImpl( final var sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); final var tableReference = tableGroup.getPrimaryTableReference(); final var selectableMapping = embeddedPartDescriptor.getEmbeddableTypeDescriptor().getAggregateMapping(); - final Expression expression = sqlExpressionResolver.resolveSqlExpression( tableReference, selectableMapping ); + final var expression = sqlExpressionResolver.resolveSqlExpression( tableReference, selectableMapping ); final var typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); - final SqlSelection aggregateSelection = sqlExpressionResolver.resolveSqlSelection( + final var aggregateSelection = sqlExpressionResolver.resolveSqlSelection( expression, // Using the Object[] type here, so that a different JDBC extractor is chosen - typeConfiguration.getJavaTypeRegistry().resolveDescriptor( Object[].class ), + typeConfiguration.getJavaTypeRegistry() + .resolveDescriptor( Object[].class ), null, typeConfiguration ); @@ -110,7 +106,7 @@ public int[] getAggregateValuesArrayPositions() { } private static boolean determineIfContainedAnyScalars(ImmutableFetchList fetches) { - for ( Fetch fetch : fetches ) { + for ( var fetch : fetches ) { if ( fetch.containsAnyNonScalarResults() ) { return true; } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableAssembler.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableAssembler.java index b3859c877b29..7353c0d0e0a7 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableAssembler.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableAssembler.java @@ -30,8 +30,8 @@ public JavaType getAssembledJavaType() { @Override public Object assemble(RowProcessingState rowProcessingState) { - final InitializerData data = initializer.getData( rowProcessingState ); - final Initializer.State state = data.getState(); + final var data = initializer.getData( rowProcessingState ); + final var state = data.getState(); if ( state == Initializer.State.UNINITIALIZED ) { initializer.resolveKey( data ); } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableExpressionResultImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableExpressionResultImpl.java index 962bda928a9b..6606d22c7eff 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableExpressionResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableExpressionResultImpl.java @@ -9,16 +9,12 @@ import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; import org.hibernate.metamodel.mapping.internal.BasicAttributeMapping; import org.hibernate.spi.NavigablePath; -import org.hibernate.sql.ast.spi.SqlAstCreationState; -import org.hibernate.sql.ast.spi.SqlExpressionResolver; -import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.tree.expression.SqlTuple; import org.hibernate.sql.results.graph.AbstractFetchParent; import org.hibernate.sql.results.graph.AssemblerCreationState; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResultAssembler; import org.hibernate.sql.results.graph.DomainResultCreationState; -import org.hibernate.sql.results.graph.Fetch; import org.hibernate.sql.results.graph.Initializer; import org.hibernate.sql.results.graph.InitializerParent; import org.hibernate.sql.results.graph.InitializerProducer; @@ -27,7 +23,6 @@ import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode; import org.hibernate.sql.results.graph.internal.ImmutableFetchList; import org.hibernate.type.descriptor.java.JavaType; -import org.hibernate.type.spi.TypeConfiguration; /** * @author Steve Ebersole @@ -48,15 +43,15 @@ public EmbeddableExpressionResultImpl( this.fetchContainer = modelPart.getEmbeddableTypeDescriptor(); this.resultVariable = resultVariable; - final ImmutableFetchList.Builder fetches = new ImmutableFetchList.Builder( modelPart ); - final EmbeddableMappingType mappingType = modelPart.getEmbeddableTypeDescriptor(); + final var fetches = new ImmutableFetchList.Builder( modelPart ); + final var mappingType = modelPart.getEmbeddableTypeDescriptor(); final int numberOfAttributeMappings = mappingType.getNumberOfAttributeMappings(); - final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState(); - final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); - final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); + final var sqlAstCreationState = creationState.getSqlAstCreationState(); + final var typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); + final var sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); for ( int i = 0; i < numberOfAttributeMappings; i++ ) { - final BasicAttributeMapping attribute = (BasicAttributeMapping) mappingType.getAttributeMapping( i ); - final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( + final var attribute = (BasicAttributeMapping) mappingType.getAttributeMapping( i ); + final var sqlSelection = sqlExpressionResolver.resolveSqlSelection( sqlExpression.getExpressions().get( i ), attribute.getJavaType(), this, @@ -69,7 +64,6 @@ public EmbeddableExpressionResultImpl( resolveNavigablePath( attribute ), attribute, FetchTiming.IMMEDIATE, - creationState, !sqlSelection.isVirtual() ) ); @@ -80,7 +74,7 @@ public EmbeddableExpressionResultImpl( } private static boolean determineIfContainedAnyScalars(ImmutableFetchList fetches) { - for ( Fetch fetch : fetches ) { + for ( var fetch : fetches ) { if ( fetch.containsAnyNonScalarResults() ) { return true; } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableFetchImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableFetchImpl.java index 7328d783ee8e..be0b5d814919 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableFetchImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableFetchImpl.java @@ -13,11 +13,8 @@ import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.SqlAstJoinType; -import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableGroupJoin; import org.hibernate.sql.ast.tree.from.TableGroupProducer; -import org.hibernate.sql.ast.tree.from.TableReference; import org.hibernate.sql.ast.tree.predicate.NullnessPredicate; import org.hibernate.sql.results.graph.AbstractFetchParent; import org.hibernate.sql.results.graph.AssemblerCreationState; @@ -34,7 +31,6 @@ import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer; import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode; import org.hibernate.sql.results.graph.embeddable.EmbeddableValuedFetchable; -import org.hibernate.type.BasicType; import static org.hibernate.internal.util.NullnessUtil.castNonNull; @@ -66,13 +62,15 @@ public EmbeddableFetchImpl( this.fetchTiming = fetchTiming; this.hasTableGroup = hasTableGroup; - this.tableGroup = creationState.getSqlAstCreationState().getFromClauseAccess().resolveTableGroup( + final var sqlAstCreationState = creationState.getSqlAstCreationState(); + + this.tableGroup = sqlAstCreationState.getFromClauseAccess().resolveTableGroup( getNavigablePath(), np -> { - final TableGroup lhsTableGroup = creationState.getSqlAstCreationState() - .getFromClauseAccess() - .findTableGroup( fetchParent.getNavigablePath() ); - final TableGroupJoin tableGroupJoin = getReferencedMappingContainer().createTableGroupJoin( + final TableGroup lhsTableGroup = + sqlAstCreationState.getFromClauseAccess() + .findTableGroup( fetchParent.getNavigablePath() ); + final var tableGroupJoin = getReferencedMappingContainer().createTableGroupJoin( getNavigablePath(), lhsTableGroup, null, @@ -80,7 +78,7 @@ public EmbeddableFetchImpl( SqlAstJoinType.INNER, true, false, - creationState.getSqlAstCreationState() + sqlAstCreationState ); lhsTableGroup.addTableGroupJoin( tableGroupJoin ); return tableGroupJoin.getJoinedGroup(); @@ -89,14 +87,17 @@ public EmbeddableFetchImpl( this.discriminatorFetch = creationState.visitEmbeddableDiscriminatorFetch( this, false ); if ( fetchContainer.getAggregateMapping() != null ) { - final TableReference tableReference = tableGroup.resolveTableReference( + final var tableReference = tableGroup.resolveTableReference( fetchContainer.getAggregateMapping().getContainingTableExpression() ); - final Expression aggregateExpression = creationState.getSqlAstCreationState().getSqlExpressionResolver() - .resolveSqlExpression( tableReference, fetchContainer.getAggregateMapping() ); - final BasicType booleanType = creationState.getSqlAstCreationState().getCreationContext() - .getTypeConfiguration().getBasicTypeForJavaType( Boolean.class ); - this.nullIndicatorResult = new NullnessPredicate( aggregateExpression, false, booleanType ) - .createDomainResult( null, creationState ); + final var aggregateExpression = + sqlAstCreationState.getSqlExpressionResolver() + .resolveSqlExpression( tableReference, fetchContainer.getAggregateMapping() ); + final var booleanType = + sqlAstCreationState.getCreationContext().getTypeConfiguration() + .getBasicTypeForJavaType( Boolean.class ); + this.nullIndicatorResult = + new NullnessPredicate( aggregateExpression, false, booleanType ) + .createDomainResult( null, creationState ); } else { this.nullIndicatorResult = null; @@ -153,8 +154,8 @@ public Fetchable getFetchedMapping() { @Override public NavigablePath resolveNavigablePath(Fetchable fetchable) { if ( fetchable instanceof TableGroupProducer ) { - for ( TableGroupJoin tableGroupJoin : tableGroup.getTableGroupJoins() ) { - final NavigablePath navigablePath = tableGroupJoin.getNavigablePath(); + for ( var tableGroupJoin : tableGroup.getTableGroupJoins() ) { + final var navigablePath = tableGroupJoin.getNavigablePath(); if ( tableGroupJoin.getJoinedGroup().isFetched() && fetchable.getFetchableName().equals( navigablePath.getLocalName() ) && tableGroupJoin.getJoinedGroup().getModelPart() == fetchable diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableForeignKeyResultImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableForeignKeyResultImpl.java index ed5201bd37df..77379ae65d9f 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableForeignKeyResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableForeignKeyResultImpl.java @@ -88,9 +88,9 @@ public Fetch generateFetchableFetch( final boolean shouldSelect; if ( fetchable instanceof ToOneAttributeMapping toOne ) { // We need to make sure to-ones are always delayed to avoid cycles while resolving entity keys - shouldSelect = selected && !creationState.isAssociationKeyVisited( - toOne.getForeignKeyDescriptor().getAssociationKey() - ) && !ForeignKeyDescriptor.PART_NAME.equals( getNavigablePath().getLocalName() ) + shouldSelect = selected + && !creationState.isAssociationKeyVisited( toOne.getForeignKeyDescriptor().getAssociationKey() ) + && !ForeignKeyDescriptor.PART_NAME.equals( getNavigablePath().getLocalName() ) && !ForeignKeyDescriptor.TARGET_PART_NAME.equals( getNavigablePath().getLocalName() ); } else { diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableResultImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableResultImpl.java index 31177d8a69ad..0251604497d3 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableResultImpl.java @@ -11,17 +11,13 @@ import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.SqlAstJoinType; import org.hibernate.sql.ast.spi.SqlAstCreationState; -import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableGroupJoin; -import org.hibernate.sql.ast.tree.from.TableReference; import org.hibernate.sql.ast.tree.predicate.NullnessPredicate; import org.hibernate.sql.results.graph.AbstractFetchParent; import org.hibernate.sql.results.graph.AssemblerCreationState; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResultAssembler; import org.hibernate.sql.results.graph.DomainResultCreationState; -import org.hibernate.sql.results.graph.Fetch; import org.hibernate.sql.results.graph.Initializer; import org.hibernate.sql.results.graph.InitializerParent; import org.hibernate.sql.results.graph.InitializerProducer; @@ -29,7 +25,6 @@ import org.hibernate.sql.results.graph.embeddable.EmbeddableResult; import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode; import org.hibernate.sql.results.graph.internal.ImmutableFetchList; -import org.hibernate.type.BasicType; import org.hibernate.type.descriptor.java.JavaType; /** @@ -62,13 +57,13 @@ public EmbeddableResultImpl( final var sqlAstCreationState = creationState.getSqlAstCreationState(); final var fromClauseAccess = sqlAstCreationState.getFromClauseAccess(); - final TableGroup embeddableTableGroup = fromClauseAccess.resolveTableGroup( + final var embeddableTableGroup = fromClauseAccess.resolveTableGroup( getNavigablePath(), np -> { final var embeddedValueMapping = modelPart.getEmbeddableTypeDescriptor().getEmbeddedValueMapping(); - final TableGroup tableGroup = + final var tableGroup = fromClauseAccess.findTableGroup( NullnessUtil.castNonNull( np.getParent() ).getParent() ); - final TableGroupJoin tableGroupJoin = embeddedValueMapping.createTableGroupJoin( + final var tableGroupJoin = embeddedValueMapping.createTableGroupJoin( np, tableGroup, resultVariable, @@ -98,14 +93,15 @@ private DomainResult nullIndicatorResult( SqlAstCreationState sqlAstCreationState) { final var aggregateMapping = fetchContainer.getAggregateMapping(); if ( aggregateMapping != null ) { - final TableReference tableReference = - embeddableTableGroup.resolveTableReference( aggregateMapping.getContainingTableExpression() ); - final Expression aggregateExpression = + final var tableReference = + embeddableTableGroup.resolveTableReference( + aggregateMapping.getContainingTableExpression() ); + final var aggregateExpression = sqlAstCreationState.getSqlExpressionResolver() .resolveSqlExpression( tableReference, aggregateMapping ); - final BasicType booleanType = - sqlAstCreationState.getCreationContext() - .getTypeConfiguration().getBasicTypeForJavaType( Boolean.class ); + final var booleanType = + sqlAstCreationState.getCreationContext().getTypeConfiguration() + .getBasicTypeForJavaType( Boolean.class ); return new NullnessPredicate( aggregateExpression, false, booleanType ) .createDomainResult( null, creationState ); } @@ -115,7 +111,7 @@ private DomainResult nullIndicatorResult( } private static boolean determineIfContainedAnyScalars(ImmutableFetchList fetches) { - for ( Fetch fetch : fetches ) { + for ( var fetch : fetches ) { if ( fetch.containsAnyNonScalarResults() ) { return true; } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NestedRowProcessingState.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NestedRowProcessingState.java index 6503ab0bbf7c..fdb9647ed44b 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NestedRowProcessingState.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NestedRowProcessingState.java @@ -34,18 +34,14 @@ public NestedRowProcessingState( public static NestedRowProcessingState wrap( AggregateEmbeddableInitializerImpl aggregateEmbeddableInitializer, RowProcessingState processingState) { - if ( processingState instanceof NestedRowProcessingState nestedRowProcessingState ) { - return new NestedRowProcessingState( - aggregateEmbeddableInitializer, - nestedRowProcessingState.processingState - ); - } - return new NestedRowProcessingState( aggregateEmbeddableInitializer, processingState ); + return processingState instanceof NestedRowProcessingState nestedState + ? new NestedRowProcessingState( aggregateEmbeddableInitializer, nestedState.processingState ) + : new NestedRowProcessingState( aggregateEmbeddableInitializer, processingState ); } @Override public Object getJdbcValue(int position) { - final Object[] jdbcValue = aggregateEmbeddableInitializer.getJdbcValues( processingState ); + final var jdbcValue = aggregateEmbeddableInitializer.getJdbcValues( processingState ); return jdbcValue == null ? null : jdbcValue[position]; } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/AbstractEntityResultGraphNode.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/AbstractEntityResultGraphNode.java index f7862d572647..1bb2e8795dd7 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/AbstractEntityResultGraphNode.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/AbstractEntityResultGraphNode.java @@ -7,10 +7,8 @@ import java.util.BitSet; import org.hibernate.metamodel.mapping.EntityMappingType; -import org.hibernate.metamodel.mapping.EntityRowIdMapping; import org.hibernate.metamodel.mapping.EntityValuedModelPart; import org.hibernate.persister.entity.AbstractEntityPersister; -import org.hibernate.persister.entity.EntityPersister; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.results.graph.AbstractFetchParent; @@ -42,34 +40,53 @@ public AbstractEntityResultGraphNode(EntityValuedModelPart referencedModelPart, @Override public void afterInitialize(FetchParent fetchParent, DomainResultCreationState creationState) { - final NavigablePath navigablePath = getNavigablePath(); - final TableGroup entityTableGroup = creationState.getSqlAstCreationState().getFromClauseAccess() - .getTableGroup( navigablePath ); - final EntityResultGraphNode entityResultGraphNode = (EntityResultGraphNode) fetchParent; - final Fetch idFetch = creationState.visitIdentifierFetch( entityResultGraphNode ); - if ( navigablePath.getParent() == null && !creationState.forceIdentifierSelection() && - ( idFetch.asFetchParent() == null || !idFetch.asFetchParent().containsCollectionFetches() ) ) { - identifierFetch = null; - } - else { - identifierFetch = idFetch; - } + final var navigablePath = getNavigablePath(); + final var entityTableGroup = + creationState.getSqlAstCreationState().getFromClauseAccess() + .getTableGroup( navigablePath ); + final var entityResultGraphNode = (EntityResultGraphNode) fetchParent; + identifierFetch = identifierFetch( creationState, entityResultGraphNode, navigablePath ); discriminatorFetch = creationState.visitDiscriminatorFetch( entityResultGraphNode ); - final EntityRowIdMapping rowIdMapping = getEntityValuedModelPart().getEntityMappingType().getRowIdMapping(); + rowIdResult = rowIdResult( creationState, navigablePath, entityTableGroup ); + + super.afterInitialize( fetchParent, creationState ); + } + + private DomainResult rowIdResult( + DomainResultCreationState creationState, + NavigablePath navigablePath, + TableGroup entityTableGroup) { + final var rowIdMapping = + getEntityValuedModelPart().getEntityMappingType() + .getRowIdMapping(); if ( rowIdMapping == null ) { - rowIdResult = null; + return null; } else { - rowIdResult = rowIdMapping.createDomainResult( + return rowIdMapping.createDomainResult( navigablePath.append( rowIdMapping.getRowIdName() ), entityTableGroup, AbstractEntityPersister.ROWID_ALIAS, creationState ); } - super.afterInitialize( fetchParent, creationState ); + } + + private Fetch identifierFetch( + DomainResultCreationState creationState, + EntityResultGraphNode entityResultGraphNode, + NavigablePath navigablePath) { + final var idFetch = creationState.visitIdentifierFetch( entityResultGraphNode ); + if ( navigablePath.getParent() == null + && !creationState.forceIdentifierSelection() + && ( idFetch.asFetchParent() == null || !idFetch.asFetchParent().containsCollectionFetches() ) ) { + return null; + } + else { + return idFetch; + } } @Override @@ -106,7 +123,7 @@ public DomainResult getRowIdResult() { @Override public void collectValueIndexesToCache(BitSet valueIndexes) { - final EntityPersister entityPersister = fetchContainer.getEntityMappingType().getEntityPersister(); + final var entityPersister = fetchContainer.getEntityMappingType().getEntityPersister(); if ( identifierFetch != null ) { identifierFetch.collectValueIndexesToCache( valueIndexes ); } @@ -119,7 +136,8 @@ public void collectValueIndexesToCache(BitSet valueIndexes) { } super.collectValueIndexesToCache( valueIndexes ); } - else if ( entityPersister.storeDiscriminatorInShallowQueryCacheLayout() && discriminatorFetch != null ) { + else if ( entityPersister.storeDiscriminatorInShallowQueryCacheLayout() + && discriminatorFetch != null ) { discriminatorFetch.collectValueIndexesToCache( valueIndexes ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/EntityResult.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/EntityResult.java index 9c8af0fd2b08..1bd89f8be823 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/EntityResult.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/EntityResult.java @@ -11,5 +11,5 @@ * * @author Steve Ebersole */ -public interface EntityResult extends EntityResultGraphNode, DomainResult { +public interface EntityResult extends EntityResultGraphNode, DomainResult { } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchJoinedImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchJoinedImpl.java index 0942f6639677..982435d3f4e0 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchJoinedImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchJoinedImpl.java @@ -55,13 +55,12 @@ public EntityFetchJoinedImpl( this.notFoundAction = toOneMapping.getNotFoundAction(); this.sourceAlias = tableGroup.getSourceAlias(); this.isAffectedByFilter = isAffectedByFilter; - this.entityResult = new EntityResultImpl( + this.entityResult = new EntityResultImpl<>( navigablePath, toOneMapping, tableGroup, null ); - this.entityResult.afterInitialize( this, creationState ); } @@ -77,13 +76,12 @@ public EntityFetchJoinedImpl( this.keyResult = null; this.sourceAlias = tableGroup.getSourceAlias(); this.isAffectedByFilter = false; - this.entityResult = new EntityResultImpl( + this.entityResult = new EntityResultImpl<>( navigablePath, collectionPart, tableGroup, null ); - this.entityResult.afterInitialize( this, creationState ); } @@ -174,7 +172,7 @@ public boolean hasTableGroup() { return true; } - public EntityResultImpl getEntityResult() { + public EntityResultImpl getEntityResult() { return entityResult; } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityResultImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityResultImpl.java index b427b81f422b..8cd64cd79952 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityResultImpl.java @@ -8,7 +8,6 @@ import org.hibernate.metamodel.mapping.EntityValuedModelPart; import org.hibernate.spi.NavigablePath; import org.hibernate.sql.ast.tree.from.TableGroup; -import org.hibernate.sql.ast.tree.from.TableGroupJoin; import org.hibernate.sql.ast.tree.from.TableGroupProducer; import org.hibernate.sql.results.graph.AssemblerCreationState; import org.hibernate.sql.results.graph.DomainResultAssembler; @@ -19,6 +18,7 @@ import org.hibernate.sql.results.graph.InitializerProducer; import org.hibernate.sql.results.graph.entity.AbstractEntityResultGraphNode; import org.hibernate.sql.results.graph.entity.EntityResult; +import org.hibernate.type.descriptor.java.JavaType; import static org.hibernate.internal.util.NullnessUtil.castNonNull; @@ -27,8 +27,8 @@ * * @author Steve Ebersole */ -public class EntityResultImpl extends AbstractEntityResultGraphNode - implements EntityResult, InitializerProducer { +public class EntityResultImpl extends AbstractEntityResultGraphNode + implements EntityResult, InitializerProducer> { private final TableGroup tableGroup; private final String resultVariable; @@ -46,8 +46,8 @@ public EntityResultImpl( @Override public NavigablePath resolveNavigablePath(Fetchable fetchable) { if ( fetchable instanceof TableGroupProducer ) { - for ( TableGroupJoin tableGroupJoin : tableGroup.getTableGroupJoins() ) { - final NavigablePath navigablePath = tableGroupJoin.getNavigablePath(); + for ( var tableGroupJoin : tableGroup.getTableGroupJoins() ) { + final var navigablePath = tableGroupJoin.getNavigablePath(); if ( tableGroupJoin.getJoinedGroup().isFetched() && fetchable.getFetchableName().equals( navigablePath.getLocalName() ) && tableGroupJoin.getJoinedGroup().getModelPart() == fetchable @@ -79,8 +79,13 @@ protected String getSourceAlias() { } @Override - public DomainResultAssembler createResultAssembler( - InitializerParent parent, + public JavaType getResultJavaType() { + return (JavaType) super.getResultJavaType(); + } + + @Override + public DomainResultAssembler createResultAssembler( + InitializerParent parent, AssemblerCreationState creationState) { return new EntityAssembler<>( this.getResultJavaType(), @@ -90,7 +95,7 @@ public DomainResultAssembler createResultAssembler( @Override public Initializer createInitializer( - EntityResultImpl resultGraphNode, + EntityResultImpl resultGraphNode, InitializerParent parent, AssemblerCreationState creationState) { return resultGraphNode.createInitializer( parent, creationState ); diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/LoadContexts.java b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/LoadContexts.java index 5bf7ff0e54bf..b2c36ca5c04a 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/LoadContexts.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/LoadContexts.java @@ -34,7 +34,7 @@ public void register(JdbcValuesSourceProcessingState state) { } public void deregister(JdbcValuesSourceProcessingState state) { - final JdbcValuesSourceProcessingState previous = jdbcValuesSourceProcessingStateStack.pop(); + final var previous = jdbcValuesSourceProcessingStateStack.pop(); if ( previous != state ) { throw new IllegalStateException( "Illegal pop() with non-matching JdbcValuesSourceProcessingState" ); } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ManagedResultConsumer.java b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ManagedResultConsumer.java index 5dec8e2fec6a..c5688d4bd56f 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ManagedResultConsumer.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ManagedResultConsumer.java @@ -5,7 +5,6 @@ package org.hibernate.sql.results.spi; import org.hibernate.Incubating; -import org.hibernate.engine.spi.PersistenceContext; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl; import org.hibernate.sql.results.jdbc.spi.JdbcValues; @@ -30,7 +29,7 @@ public Void consume( JdbcValuesSourceProcessingState jdbcValuesSourceProcessingState, RowProcessingStateStandardImpl rowProcessingState, RowReader rowReader) { - final PersistenceContext persistenceContext = session.getPersistenceContextInternal(); + final var persistenceContext = session.getPersistenceContextInternal(); RuntimeException ex = null; persistenceContext.beforeLoad(); persistenceContext.getLoadContexts().register( jdbcValuesSourceProcessingState ); diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ScrollableResultsConsumer.java b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ScrollableResultsConsumer.java index b0d6175ecdb2..a7dfc1194705 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ScrollableResultsConsumer.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/ScrollableResultsConsumer.java @@ -4,12 +4,10 @@ */ package org.hibernate.sql.results.spi; -import java.util.List; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.scrollable.FetchingScrollableResultsImpl; import org.hibernate.internal.scrollable.ScrollableResultsImpl; -import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.entity.EntityResult; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMapping; import org.hibernate.sql.results.jdbc.spi.JdbcValues; @@ -73,9 +71,9 @@ public boolean canResultsBeCached() { } private boolean containsCollectionFetches(JdbcValuesMapping valuesMapping) { - final List> domainResults = valuesMapping.getDomainResults(); - for ( DomainResult domainResult : domainResults ) { - if ( domainResult instanceof EntityResult entityResult && entityResult.containsCollectionFetches() ) { + for ( var domainResult : valuesMapping.getDomainResults() ) { + if ( domainResult instanceof EntityResult entityResult + && entityResult.containsCollectionFetches() ) { return true; } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/SingleResultConsumer.java b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/SingleResultConsumer.java index 398c91cd1141..15cba1b2fe4b 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/spi/SingleResultConsumer.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/spi/SingleResultConsumer.java @@ -5,7 +5,6 @@ package org.hibernate.sql.results.spi; import org.hibernate.Incubating; -import org.hibernate.engine.spi.PersistenceContext; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.query.SelectionQuery; import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl; @@ -38,7 +37,7 @@ public T consume( JdbcValuesSourceProcessingState jdbcValuesSourceProcessingState, RowProcessingStateStandardImpl rowProcessingState, RowReader rowReader) { - final PersistenceContext persistenceContext = session.getPersistenceContextInternal(); + final var persistenceContext = session.getPersistenceContextInternal(); RuntimeException ex = null; persistenceContext.beforeLoad(); persistenceContext.getLoadContexts().register( jdbcValuesSourceProcessingState );