Skip to content

Commit 1495162

Browse files
committed
HHH-19936 Ensure by-id parameters use SqlTypedMapping when possible
1 parent 6075969 commit 1495162

12 files changed

+164
-114
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/temptable/TemporaryTableColumn.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,17 @@
88

99
import org.hibernate.engine.jdbc.Size;
1010
import org.hibernate.metamodel.mapping.JdbcMapping;
11+
import org.hibernate.metamodel.mapping.SqlTypedMapping;
12+
13+
import org.checkerframework.checker.nullness.qual.Nullable;
1114

1215
/**
1316
* A column in a IdTable. As these columns mirror the entity id columns, we know a few things about it inherently,
1417
* such as being non-nullable
1518
*
1619
* @author Steve Ebersole
1720
*/
18-
public class TemporaryTableColumn {
21+
public class TemporaryTableColumn implements SqlTypedMapping {
1922
private final TemporaryTable containingTable;
2023
private final String columnName;
2124
private final JdbcMapping jdbcMapping;
@@ -59,6 +62,7 @@ public String getColumnName() {
5962
return columnName;
6063
}
6164

65+
@Override
6266
public JdbcMapping getJdbcMapping() {
6367
return jdbcMapping;
6468
}
@@ -82,4 +86,29 @@ public boolean isNullable() {
8286
public boolean isPrimaryKey() {
8387
return primaryKey;
8488
}
89+
90+
@Override
91+
public @Nullable String getColumnDefinition() {
92+
return sqlTypeName;
93+
}
94+
95+
@Override
96+
public @Nullable Long getLength() {
97+
return size.getLength();
98+
}
99+
100+
@Override
101+
public @Nullable Integer getPrecision() {
102+
return size.getPrecision();
103+
}
104+
105+
@Override
106+
public @Nullable Integer getScale() {
107+
return size.getScale();
108+
}
109+
110+
@Override
111+
public @Nullable Integer getTemporalPrecision() {
112+
return getJdbcMapping().getJdbcType().isTemporal() ? size.getPrecision() : null;
113+
}
85114
}

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionBatchLoaderArrayParam.java

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,18 @@
1919
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
2020
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
2121
import org.hibernate.metamodel.mapping.JdbcMapping;
22-
import org.hibernate.metamodel.mapping.NonAggregatedIdentifierMapping;
2322
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
24-
import org.hibernate.metamodel.mapping.ValuedModelPart;
25-
import org.hibernate.metamodel.mapping.internal.IdClassEmbeddable;
23+
import org.hibernate.metamodel.mapping.SelectableMapping;
24+
import org.hibernate.metamodel.mapping.SqlTypedMapping;
25+
import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl;
2626
import org.hibernate.query.spi.QueryOptions;
2727
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
2828
import org.hibernate.sql.ast.tree.from.TableGroup;
2929
import org.hibernate.sql.ast.tree.select.QuerySpec;
3030
import org.hibernate.sql.ast.tree.select.SelectStatement;
3131
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
3232
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
33-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
33+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
3434
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
3535
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
3636
import org.hibernate.sql.exec.spi.JdbcParametersList;
@@ -51,7 +51,7 @@ public class CollectionBatchLoaderArrayParam
5151
extends AbstractCollectionBatchLoader
5252
implements SqlArrayMultiKeyLoader {
5353
private final Class<?> keyDomainType;
54-
private final JdbcMapping arrayJdbcMapping;
54+
private final SqlTypedMapping arraySqlTypedMapping;
5555
private final JdbcParameter jdbcParameter;
5656
private final SelectStatement sqlSelect;
5757
private final JdbcOperationQuerySelect jdbcSelectOperation;
@@ -72,22 +72,31 @@ public CollectionBatchLoaderArrayParam(
7272
}
7373

7474
final ForeignKeyDescriptor keyDescriptor = getLoadable().getKeyDescriptor();
75-
final JdbcMapping jdbcMapping = keyDescriptor.getSingleJdbcMapping();
75+
final SelectableMapping selectable = keyDescriptor.getSelectable( 0 );
76+
final JdbcMapping jdbcMapping = selectable.getJdbcMapping();
7677
final Class<?> jdbcArrayClass = Array.newInstance( jdbcMapping.getJdbcJavaType().getJavaTypeClass(), 0 )
7778
.getClass();
7879
keyDomainType = getKeyType( keyDescriptor.getKeyPart() );
7980

8081
final BasicType<?> arrayBasicType = getSessionFactory().getTypeConfiguration()
8182
.getBasicTypeRegistry()
8283
.getRegisteredType( jdbcArrayClass );
83-
arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping(
84-
arrayBasicType,
85-
jdbcMapping,
86-
jdbcArrayClass,
87-
getSessionFactory()
84+
85+
arraySqlTypedMapping = new SqlTypedMappingImpl(
86+
selectable.getColumnDefinition(),
87+
selectable.getLength(),
88+
selectable.getPrecision(),
89+
selectable.getScale(),
90+
selectable.getTemporalPrecision(),
91+
MultiKeyLoadHelper.resolveArrayJdbcMapping(
92+
arrayBasicType,
93+
jdbcMapping,
94+
jdbcArrayClass,
95+
getSessionFactory()
96+
)
8897
);
8998

90-
jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping );
99+
jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping );
91100
sqlSelect = LoaderSelectBuilder.createSelectBySingleArrayParameter(
92101
getLoadable(),
93102
keyDescriptor.getKeyPart(),
@@ -191,7 +200,7 @@ void initializeKeys(Object key, Object[] keysToInitialize, SharedSessionContract
191200
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(1);
192201
jdbcParameterBindings.addBinding(
193202
jdbcParameter,
194-
new JdbcParameterBindingImpl( arrayJdbcMapping, keysToInitialize )
203+
new JdbcParameterBindingImpl( arraySqlTypedMapping.getJdbcMapping(), keysToInitialize )
195204
);
196205

197206
final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler(

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CompoundNaturalIdLoader.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.hibernate.sql.ast.tree.predicate.Predicate;
2626
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
2727
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
28+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
2829
import org.hibernate.sql.exec.spi.JdbcParameterBinding;
2930

3031
/**
@@ -83,7 +84,7 @@ protected void applyNaturalIdRestriction(
8384
predicateConsumer.accept( new NullnessPredicate( columnReference ) );
8485
}
8586
else {
86-
final JdbcParameter jdbcParameter = new JdbcParameterImpl( jdbcValueMapping.getJdbcMapping() );
87+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( jdbcValueMapping );
8788
final ComparisonPredicate predicate = new ComparisonPredicate(
8889
columnReference,
8990
ComparisonOperator.EQUAL,

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.hibernate.sql.exec.internal.BaseExecutionContext;
3636
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
3737
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
38+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
3839
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
3940
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
4041
import org.hibernate.sql.exec.spi.JdbcParametersList;
@@ -112,7 +113,7 @@ class DatabaseSnapshotExecutor {
112113
selection.getContainingTableExpression()
113114
);
114115

115-
final JdbcParameter jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() );
116+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
116117
jdbcParametersBuilder.add( jdbcParameter );
117118

118119
final ColumnReference columnReference = (ColumnReference) sqlExpressionResolver

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/EntityBatchLoaderArrayParam.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@
1212

1313
import org.hibernate.LockOptions;
1414
import org.hibernate.engine.spi.LoadQueryInfluencers;
15-
import org.hibernate.engine.spi.SessionFactoryImplementor;
1615
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1716
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
18-
import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping;
1917
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
2018
import org.hibernate.metamodel.mapping.EntityMappingType;
2119
import org.hibernate.metamodel.mapping.JdbcMapping;
20+
import org.hibernate.metamodel.mapping.SelectableMapping;
21+
import org.hibernate.metamodel.mapping.SqlTypedMapping;
22+
import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl;
2223
import org.hibernate.query.spi.QueryOptions;
2324
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
2425
import org.hibernate.sql.ast.tree.select.SelectStatement;
2526
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
27+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
2628
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
2729
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
2830

@@ -43,8 +45,8 @@ public class EntityBatchLoaderArrayParam<T>
4345
private final int domainBatchSize;
4446

4547
private final LoadQueryInfluencers loadQueryInfluencers;
46-
private final BasicEntityIdentifierMapping identifierMapping;
47-
private final JdbcMapping arrayJdbcMapping;
48+
private final EntityIdentifierMapping identifierMapping;
49+
private final SqlTypedMapping arraySqlTypedMapping;
4850
private final JdbcParameter jdbcParameter;
4951
private final SelectStatement sqlAst;
5052
private final JdbcOperationQuerySelect jdbcSelectOperation;
@@ -77,17 +79,26 @@ public EntityBatchLoaderArrayParam(
7779
);
7880
}
7981

80-
identifierMapping = (BasicEntityIdentifierMapping) getLoadable().getIdentifierMapping();
81-
final Class<?> arrayClass =
82-
Array.newInstance( identifierMapping.getJavaType().getJavaTypeClass(), 0 ).getClass();
83-
arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping(
84-
sessionFactory.getTypeConfiguration().getBasicTypeRegistry().getRegisteredType( arrayClass ),
85-
identifierMapping.getJdbcMapping(),
86-
arrayClass,
87-
sessionFactory
82+
identifierMapping = getLoadable().getIdentifierMapping();
83+
final SelectableMapping selectable = identifierMapping.getSelectable( 0 );
84+
final JdbcMapping jdbcMapping = selectable.getJdbcMapping();
85+
final Class<?> jdbcArrayClass = Array.newInstance( jdbcMapping.getJdbcJavaType().getJavaTypeClass(), 0 )
86+
.getClass();
87+
arraySqlTypedMapping = new SqlTypedMappingImpl(
88+
selectable.getColumnDefinition(),
89+
selectable.getLength(),
90+
selectable.getPrecision(),
91+
selectable.getScale(),
92+
selectable.getTemporalPrecision(),
93+
MultiKeyLoadHelper.resolveArrayJdbcMapping(
94+
sessionFactory.getTypeConfiguration().getBasicTypeRegistry().getRegisteredType( jdbcArrayClass ),
95+
jdbcMapping,
96+
jdbcArrayClass,
97+
sessionFactory
98+
)
8899
);
89100

90-
jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping );
101+
jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping );
91102
sqlAst = LoaderSelectBuilder.createSelectBySingleArrayParameter(
92103
getLoadable(),
93104
identifierMapping,
@@ -148,7 +159,7 @@ protected void initializeEntities(
148159
sqlAst,
149160
jdbcSelectOperation,
150161
jdbcParameter,
151-
arrayJdbcMapping,
162+
arraySqlTypedMapping.getJdbcMapping(),
152163
id,
153164
entityInstance,
154165
getLoadable().getRootEntityDescriptor(),

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import org.hibernate.sql.ast.tree.select.QuerySpec;
7373
import org.hibernate.sql.ast.tree.select.SelectStatement;
7474
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
75+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
7576
import org.hibernate.sql.results.graph.BiDirectionalFetch;
7677
import org.hibernate.sql.results.graph.DomainResult;
7778
import org.hibernate.sql.results.graph.EntityGraphTraversalState;
@@ -624,7 +625,7 @@ private void applyRestriction(
624625
selection
625626
);
626627
if ( numberOfKeysToLoad == 1 ) {
627-
final JdbcParameter jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() );
628+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
628629
jdbcParameterConsumer.accept( jdbcParameter );
629630

630631
rootQuerySpec.applyPredicate(
@@ -634,11 +635,9 @@ private void applyRestriction(
634635
else {
635636
final InListPredicate predicate = new InListPredicate( columnRef );
636637
for ( int i = 0; i < numberOfKeysToLoad; i++ ) {
637-
for ( int j = 0; j < numberColumns; j++ ) {
638-
final JdbcParameter jdbcParameter = new JdbcParameterImpl( columnRef.getJdbcMapping() );
639-
jdbcParameterConsumer.accept( jdbcParameter );
640-
predicate.addExpression( jdbcParameter );
641-
}
638+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
639+
jdbcParameterConsumer.accept( jdbcParameter );
640+
predicate.addExpression( jdbcParameter );
642641
}
643642
rootQuerySpec.applyPredicate( predicate );
644643
}
@@ -666,12 +665,13 @@ private void applyRestriction(
666665

667666
for ( int i = 0; i < numberOfKeysToLoad; i++ ) {
668667
final List<JdbcParameter> tupleParams = new ArrayList<>( numberColumns );
669-
for ( int j = 0; j < numberColumns; j++ ) {
670-
final ColumnReference columnReference = columnReferences.get( j );
671-
final JdbcParameter jdbcParameter = new JdbcParameterImpl( columnReference.getJdbcMapping() );
672-
jdbcParameterConsumer.accept( jdbcParameter );
673-
tupleParams.add( jdbcParameter );
674-
}
668+
restrictedPart.forEachSelectable(
669+
(columnIndex, selection) -> {
670+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
671+
jdbcParameterConsumer.accept( jdbcParameter );
672+
tupleParams.add( jdbcParameter );
673+
}
674+
);
675675
final SqlTuple paramTuple = new SqlTuple( tupleParams, restrictedPart );
676676
predicate.addExpression( paramTuple );
677677
}

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdEntityLoaderArrayParam.java

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,18 @@
2727
import org.hibernate.loader.ast.spi.MultiIdLoadOptions;
2828
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
2929
import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping;
30+
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
3031
import org.hibernate.metamodel.mapping.EntityMappingType;
3132
import org.hibernate.metamodel.mapping.JdbcMapping;
33+
import org.hibernate.metamodel.mapping.SelectableMapping;
34+
import org.hibernate.metamodel.mapping.SqlTypedMapping;
35+
import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl;
3236
import org.hibernate.query.spi.QueryOptions;
3337
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
3438
import org.hibernate.sql.ast.tree.select.SelectStatement;
3539
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
3640
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
37-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
41+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
3842
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
3943
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
4044
import org.hibernate.sql.exec.spi.JdbcParametersList;
@@ -49,19 +53,30 @@
4953
* @author Steve Ebersole
5054
*/
5155
public class MultiIdEntityLoaderArrayParam<E> extends AbstractMultiIdEntityLoader<E> implements SqlArrayMultiKeyLoader {
52-
private final JdbcMapping arrayJdbcMapping;
56+
private final SqlTypedMapping arraySqlTypedMapping;
5357
private final JdbcParameter jdbcParameter;
5458

5559
public MultiIdEntityLoaderArrayParam(EntityMappingType entityDescriptor, SessionFactoryImplementor sessionFactory) {
5660
super( entityDescriptor, sessionFactory );
57-
final Class<?> arrayClass = createTypedArray( 0 ).getClass();
58-
arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping(
59-
getSessionFactory().getTypeConfiguration().getBasicTypeRegistry().getRegisteredType( arrayClass ),
60-
getIdentifierMapping().getJdbcMapping(),
61-
arrayClass,
62-
getSessionFactory()
61+
final EntityIdentifierMapping identifierMapping = entityDescriptor.getIdentifierMapping();
62+
final SelectableMapping selectable = identifierMapping.getSelectable( 0 );
63+
final JdbcMapping jdbcMapping = selectable.getJdbcMapping();
64+
final Class<?> jdbcArrayClass = Array.newInstance( jdbcMapping.getJdbcJavaType().getJavaTypeClass(), 0 )
65+
.getClass();
66+
arraySqlTypedMapping = new SqlTypedMappingImpl(
67+
selectable.getColumnDefinition(),
68+
selectable.getLength(),
69+
selectable.getPrecision(),
70+
selectable.getScale(),
71+
selectable.getTemporalPrecision(),
72+
MultiKeyLoadHelper.resolveArrayJdbcMapping(
73+
sessionFactory.getTypeConfiguration().getBasicTypeRegistry().getRegisteredType( jdbcArrayClass ),
74+
jdbcMapping,
75+
jdbcArrayClass,
76+
sessionFactory
77+
)
6378
);
64-
jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping );
79+
jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping );
6580
}
6681

6782
@Override
@@ -177,7 +192,10 @@ protected <K> List<E> performOrderedMultiLoad(K[] ids, MultiIdLoadOptions loadOp
177192
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(1);
178193
jdbcParameterBindings.addBinding(
179194
jdbcParameter,
180-
new JdbcParameterBindingImpl( arrayJdbcMapping, idsToLoadFromDatabase.toArray( createTypedArray(0 ) ) )
195+
new JdbcParameterBindingImpl(
196+
arraySqlTypedMapping.getJdbcMapping(),
197+
idsToLoadFromDatabase.toArray( createTypedArray( 0 ) )
198+
)
181199
);
182200

183201
final PersistenceContext persistenceContext = session.getPersistenceContext();
@@ -274,7 +292,7 @@ protected <K> List<E> performUnorderedMultiLoad(
274292
sqlAst,
275293
jdbcSelectOperation,
276294
jdbcParameter,
277-
arrayJdbcMapping,
295+
arraySqlTypedMapping.getJdbcMapping(),
278296
null,
279297
null,
280298
null,
@@ -395,6 +413,12 @@ protected final <R,K> K[] processResolvableEntities(
395413

396414
private <X> X[] createTypedArray(@SuppressWarnings("SameParameterValue") int length) {
397415
//noinspection unchecked
398-
return (X[]) Array.newInstance( getIdentifierMapping().getJavaType().getJavaTypeClass(), length );
416+
return (X[]) Array.newInstance(
417+
getIdentifierMapping().getSelectable( 0 )
418+
.getJdbcMapping()
419+
.getJdbcJavaType()
420+
.getJavaTypeClass(),
421+
length
422+
);
399423
}
400424
}

0 commit comments

Comments
 (0)