diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/AttributeMappingsList.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/AttributeMappingsList.java index 08cae34328..29a57a5d79 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/AttributeMappingsList.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/AttributeMappingsList.java @@ -28,7 +28,7 @@ import org.hibernate.metamodel.mapping.internal.ImmutableAttributeMappingList; * @since 6.2 */ @Incubating -public interface AttributeMappingsList extends Iterable { +public interface AttributeMappingsList { int size(); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/EmbeddableMappingType.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/EmbeddableMappingType.java index 7dd17084ed..02f3f03d91 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/EmbeddableMappingType.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/EmbeddableMappingType.java @@ -259,7 +259,9 @@ public interface EmbeddableMappingType extends ManagedMappingType, SelectableMap } default int compare(Object value1, Object value2) { - for ( AttributeMapping attributeMapping : getAttributeMappings() ) { + final AttributeMappingsList attributeMappings = getAttributeMappings(); + for ( int i = 0; i < attributeMappings.size(); i++ ) { + AttributeMapping attributeMapping = attributeMappings.get( i ); final Getter getter = attributeMapping.getPropertyAccess().getGetter(); final int comparison = attributeMapping.compare( getter.get( value1 ), getter.get( value2 ) ); if ( comparison != 0 ) { diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ManagedMappingType.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ManagedMappingType.java index 1b5902dd89..e9abebdac8 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ManagedMappingType.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ManagedMappingType.java @@ -103,7 +103,9 @@ public interface ManagedMappingType extends MappingType, FetchableContainer { @Override default boolean hasPartitionedSelectionMapping() { - for ( AttributeMapping attributeMapping : getAttributeMappings() ) { + final AttributeMappingsList attributeMappings = getAttributeMappings(); + for ( int i = 0; i < attributeMappings.size(); i++ ) { + AttributeMapping attributeMapping = attributeMappings.get( i ); if ( attributeMapping.hasPartitionedSelectionMapping() ) { return true; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ImmutableAttributeMappingList.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ImmutableAttributeMappingList.java index d1210c17ca..4d309f1829 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ImmutableAttributeMappingList.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/ImmutableAttributeMappingList.java @@ -38,11 +38,6 @@ public final class ImmutableAttributeMappingList implements AttributeMappingsLis return list[i]; //intentional unguarded array access: let it explode } - @Override - public Iterator iterator() { - return new AttributeMappingIterator(); - } - @Override public void forEach(Consumer attributeMappingConsumer) { for ( AttributeMapping o : list ) { @@ -57,16 +52,15 @@ public final class ImmutableAttributeMappingList implements AttributeMappingsLis } } - private final class AttributeMappingIterator implements Iterator { + //Intentionally not implementing Iterator + public final class AttributeMappingIterator { private int idx = 0; - @Override public boolean hasNext() { return idx < ImmutableAttributeMappingList.this.list.length; } - @Override public AttributeMapping next() { return ImmutableAttributeMappingList.this.list[idx++]; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/MutableAttributeMappingList.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/MutableAttributeMappingList.java index 70b00497d8..bf46e08d6e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/MutableAttributeMappingList.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/MutableAttributeMappingList.java @@ -7,7 +7,6 @@ package org.hibernate.metamodel.mapping.internal; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.function.Consumer; @@ -19,7 +18,7 @@ import org.hibernate.sql.results.graph.Fetchable; /** * This mutable representation of AttributeMappingsList is meant to - * exist temporarily to assit migration to the new contract. + * exist temporarily to assist migration to the new contract. * @deprecated Please get rid of it: such collections should be immutable. */ @Deprecated @@ -41,11 +40,6 @@ public final class MutableAttributeMappingList implements AttributeMappingsList return asAttributeMapping( this.list.get( idx ) ); } - @Override - public Iterator iterator() { - return new AttributeMappingIterator(); - } - @Override public void forEach(final Consumer consumer) { for ( int i = 0; i < list.size(); i++ ) { @@ -99,20 +93,4 @@ public final class MutableAttributeMappingList implements AttributeMappingsList } } - private final class AttributeMappingIterator implements Iterator { - - private Iterator iter = MutableAttributeMappingList.this.list.iterator(); - - @Override - public boolean hasNext() { - return iter.hasNext(); - } - - @Override - public AttributeMapping next() { - return asAttributeMapping( iter.next() ); - } - - } - } 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 cc41a934b4..50341f1e9b 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 @@ -2391,7 +2391,8 @@ public abstract class AbstractEntityPersister Arrays.sort( attributeNames ); int index = 0; - for ( final AttributeMapping attributeMapping : attributeMappings ) { + for ( int i = 0; i < attributeMappings.size(); i++ ) { + final AttributeMapping attributeMapping = attributeMappings.get( i ); if ( isPrefix( attributeMapping, attributeNames[index] ) ) { fields.add( attributeMapping.getStateArrayPosition() ); index++; @@ -2445,7 +2446,8 @@ public abstract class AbstractEntityPersister // Sort attribute names so that we can traverse mappings efficiently Arrays.sort( attributeNames ); int index = 0; - for ( final AttributeMapping attributeMapping : attributeMappings ) { + for ( int i = 0; i < attributeMappings.size(); i++ ) { + final AttributeMapping attributeMapping = attributeMappings.get( i ); final String attributeName = attributeMapping.getAttributeName(); if ( isPrefix( attributeMapping, attributeNames[index] ) ) { final int position = attributeMapping.getStateArrayPosition(); @@ -3363,7 +3365,8 @@ public abstract class AbstractEntityPersister protected UpdateCoordinator buildUpdateCoordinator() { // we only have updates to issue for entities with one or more singular attributes - for ( AttributeMapping attributeMapping : attributeMappings ) { + for ( int i = 0; i < attributeMappings.size(); i++ ) { + final AttributeMapping attributeMapping = attributeMappings.get( i ); if ( attributeMapping instanceof SingularAttributeMapping ) { return new UpdateCoordinatorStandard( this, factory ); } @@ -4835,7 +4838,8 @@ public abstract class AbstractEntityPersister // in the collected names. iterate here because it is already alphabetical final List collectedAttrMappings = new ArrayList<>(); - for ( AttributeMapping attributeMapping : attributeMappings ) { + for ( int i = 0; i < attributeMappings.size(); i++ ) { + final AttributeMapping attributeMapping = attributeMappings.get( i ); if ( attributeNames.contains( attributeMapping.getAttributeName() ) ) { collectedAttrMappings.add( (SingularAttributeMapping) attributeMapping ); } @@ -5798,7 +5802,8 @@ public abstract class AbstractEntityPersister @Override public int forEachSelectable(int offset, SelectableConsumer selectableConsumer) { int span = 0; - for ( AttributeMapping attributeMapping : attributeMappings ) { + for ( int i = 0; i < attributeMappings.size(); i++ ) { + final AttributeMapping attributeMapping = attributeMappings.get( i ); span += attributeMapping.forEachSelectable( span + offset, selectableConsumer ); } return span; diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinator.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinator.java index 2e35b0591c..ef60792ac7 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinator.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/DeleteCoordinator.java @@ -18,6 +18,7 @@ import org.hibernate.engine.spi.PersistenceContext; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.metamodel.mapping.AttributeMapping; +import org.hibernate.metamodel.mapping.AttributeMappingsList; import org.hibernate.metamodel.mapping.EntityRowIdMapping; import org.hibernate.metamodel.mapping.EntityVersionMapping; import org.hibernate.metamodel.mapping.SelectableMapping; @@ -357,7 +358,9 @@ public class DeleteCoordinator extends AbstractMutationCoordinator { applyOptimisticLocking( deleteGroupBuilder, loadedState, session ); final AbstractEntityPersister persister = entityPersister(); if ( persister.hasPartitionedSelectionMapping() ) { - for ( AttributeMapping attributeMapping : persister.getAttributeMappings() ) { + final AttributeMappingsList attributeMappings = persister.getAttributeMappings(); + for ( int m = 0; m < attributeMappings.size(); m++ ) { + final AttributeMapping attributeMapping = attributeMappings.get( m ); final int jdbcTypeCount = attributeMapping.getJdbcTypeCount(); for ( int i = 0; i < jdbcTypeCount; i++ ) { final SelectableMapping selectableMapping = attributeMapping.getSelectable( i ); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorStandard.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorStandard.java index 4cd4f2a7ec..91ab248d0b 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/UpdateCoordinatorStandard.java @@ -25,7 +25,6 @@ import org.hibernate.engine.jdbc.mutation.ParameterUsage; import org.hibernate.engine.jdbc.mutation.internal.MutationQueryOptions; import org.hibernate.engine.jdbc.mutation.internal.NoBatchKeyAccess; import org.hibernate.engine.jdbc.mutation.spi.BatchKeyAccess; -import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService; import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; @@ -1110,7 +1109,9 @@ public class UpdateCoordinatorStandard extends AbstractMutationCoordinator imple private void applyPartictionKeyRestriction(TableUpdateBuilder tableUpdateBuilder) { final AbstractEntityPersister persister = entityPersister(); if ( persister.hasPartitionedSelectionMapping() ) { - for ( AttributeMapping attributeMapping : persister.getAttributeMappings() ) { + final AttributeMappingsList attributeMappings = persister.getAttributeMappings(); + for ( int m = 0; m < attributeMappings.size(); m++ ) { + final AttributeMapping attributeMapping = attributeMappings.get( m ); final int jdbcTypeCount = attributeMapping.getJdbcTypeCount(); for ( int i = 0; i < jdbcTypeCount; i++ ) { final SelectableMapping selectableMapping = attributeMapping.getSelectable( i ); @@ -1624,7 +1625,9 @@ public class UpdateCoordinatorStandard extends AbstractMutationCoordinator imple private void addPartitionRestriction(TableUpdateBuilderStandard updateBuilder) { final AbstractEntityPersister persister = entityPersister(); if ( persister.hasPartitionedSelectionMapping() ) { - for ( AttributeMapping attributeMapping : persister.getAttributeMappings() ) { + final AttributeMappingsList attributeMappings = persister.getAttributeMappings(); + for ( int m = 0; m < attributeMappings.size(); m++ ) { + final AttributeMapping attributeMapping = attributeMappings.get( m ); final int jdbcTypeCount = attributeMapping.getJdbcTypeCount(); for ( int i = 0; i < jdbcTypeCount; i++ ) { final SelectableMapping selectableMapping = attributeMapping.getSelectable( i ); diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/cte/CteTable.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/cte/CteTable.java index a213df347f..fc1de86b86 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/cte/CteTable.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/cte/CteTable.java @@ -12,6 +12,7 @@ import java.util.function.Consumer; import org.hibernate.metamodel.mapping.Association; import org.hibernate.metamodel.mapping.AttributeMapping; +import org.hibernate.metamodel.mapping.AttributeMappingsList; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.metamodel.mapping.DiscriminatedAssociationModelPart; import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; @@ -166,7 +167,9 @@ public class CteTable { } else { final EmbeddableValuedModelPart embeddablePart = ( EmbeddableValuedModelPart ) modelPart; - for ( AttributeMapping mapping : embeddablePart.getEmbeddableTypeDescriptor().getAttributeMappings() ) { + final AttributeMappingsList attributeMappings = embeddablePart.getEmbeddableTypeDescriptor().getAttributeMappings(); + for ( int i = 0; i < attributeMappings.size(); i++ ) { + AttributeMapping mapping = attributeMappings.get( i ); if ( !( mapping instanceof PluralAttributeMapping ) ) { forEachCteColumn( prefix + "_" + mapping.getAttributeName(), mapping, consumer ); } @@ -188,7 +191,9 @@ public class CteTable { } offset += discriminatorMapping.getJdbcTypeCount(); } - for ( AttributeMapping attribute : entityDescriptor.getAttributeMappings() ) { + final AttributeMappingsList attributeMappings = entityDescriptor.getAttributeMappings(); + for ( int i = 0; i < attributeMappings.size(); i++ ) { + AttributeMapping attribute = attributeMappings.get( i ); if ( !( attribute instanceof PluralAttributeMapping ) ) { final int result = determineModelPartStartIndex( offset, attribute, modelPart ); if ( result < 0 ) { @@ -216,7 +221,9 @@ public class CteTable { } else if ( modelPart instanceof EmbeddableValuedModelPart ) { final EmbeddableValuedModelPart embeddablePart = ( EmbeddableValuedModelPart ) modelPart; - for ( AttributeMapping mapping : embeddablePart.getEmbeddableTypeDescriptor().getAttributeMappings() ) { + final AttributeMappingsList attributeMappings = embeddablePart.getEmbeddableTypeDescriptor().getAttributeMappings(); + for ( int i = 0; i < attributeMappings.size(); i++ ) { + final AttributeMapping mapping = attributeMappings.get( i ); final int result = determineModelPartStartIndex( offset, mapping, modelPartToFind ); if ( result < 0 ) { return result; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/binding/annotations/access/xml/XmlAccessTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/binding/annotations/access/xml/XmlAccessTest.java index 476134e31d..9d6fd73ac2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/binding/annotations/access/xml/XmlAccessTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/binding/annotations/access/xml/XmlAccessTest.java @@ -186,7 +186,7 @@ public class XmlAccessTest { .getMappingMetamodel() .findEntityDescriptor( classUnderTest.getName() ); final AttributeMappingsList attributeMappings = entityDescriptor.getAttributeMappings(); - final AttributeMapping attributeMapping = attributeMappings.iterator().next(); + final AttributeMapping attributeMapping = attributeMappings.get( 0 ); final Getter accessGetter = attributeMapping.getPropertyAccess().getGetter(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java index b8e3bb3502..49fb78fa3d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java @@ -236,9 +236,10 @@ public class CriteriaEntityGraphTest implements SessionFactoryScopeAware { .getRuntimeMetamodels() .getMappingMetamodel() .findEntityDescriptor( entityClass.getName() ); - AttributeMappingsList attributeMappings = person.getAttributeMappings(); + final AttributeMappingsList attributeMappings = person.getAttributeMappings(); Fetchable fetchable = null; - for ( AttributeMapping mapping : attributeMappings ){ + for ( int i = 0; i < attributeMappings.size(); i++ ) { + AttributeMapping mapping = attributeMappings.get( i ); if ( mapping.getAttributeName().equals( attributeName ) ) { fetchable = mapping; } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/EntityGraphLoadPlanBuilderTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/EntityGraphLoadPlanBuilderTest.java index d952117bb5..8cb2ead89c 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/EntityGraphLoadPlanBuilderTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/EntityGraphLoadPlanBuilderTest.java @@ -204,9 +204,10 @@ public class EntityGraphLoadPlanBuilderTest implements SessionFactoryScopeAware private Fetchable getFetchable(String attributeName, Class entityClass) { EntityPersister person = scope.getSessionFactory().getRuntimeMetamodels().getMappingMetamodel().findEntityDescriptor( entityClass.getName() ); - AttributeMappingsList attributeMappings = person.getAttributeMappings(); + final AttributeMappingsList attributeMappings = person.getAttributeMappings(); Fetchable fetchable = null; - for ( AttributeMapping mapping : attributeMappings ) { + for ( int i = 0; i < attributeMappings.size(); i++ ) { + AttributeMapping mapping = attributeMappings.get( i ); if ( mapping.getAttributeName().equals( attributeName ) ) { fetchable = mapping; } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java index 67ad994c64..4382e2abbc 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java @@ -235,7 +235,8 @@ public class HqlEntityGraphTest implements SessionFactoryScopeAware { .findEntityDescriptor( entityClass.getName() ); AttributeMappingsList attributeMappings = person.getAttributeMappings(); Fetchable fetchable = null; - for ( AttributeMapping mapping : attributeMappings ) { + for ( int i = 0; i < attributeMappings.size(); i++ ) { + AttributeMapping mapping = attributeMappings.get( i ); if ( mapping.getAttributeName().equals( attributeName ) ) { fetchable = mapping; }