Skip to content

Commit 2e63495

Browse files
committed
HHH-19936 Ensure by-id parameters use SqlTypedMapping when possible
1 parent c26d766 commit 2e63495

16 files changed

+167
-114
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/SqlAstBasedLockingStrategy.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
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.internal.lock.LockingHelper;
3535
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
3636
import org.hibernate.sql.exec.spi.JdbcSelect;
@@ -216,8 +216,7 @@ private static void handleRestriction(
216216
LoaderSqlAstCreationState sqlAstCreationState,
217217
TableGroup rootTableGroup,
218218
JdbcParameterBindings jdbcParameterBindings) {
219-
final var jdbcMapping = jdbcValueMapping.getJdbcMapping();
220-
final var jdbcParameter = new JdbcParameterImpl( jdbcMapping );
219+
final var jdbcParameter = new SqlTypedMappingJdbcParameter( jdbcValueMapping );
221220
rootQuerySpec.applyPredicate(
222221
new ComparisonPredicate(
223222
sqlAstCreationState.getSqlExpressionResolver().resolveSqlExpression(
@@ -229,8 +228,8 @@ private static void handleRestriction(
229228
)
230229
);
231230

232-
jdbcParameterBindings.addBinding( jdbcParameter,
233-
new JdbcParameterBindingImpl( jdbcMapping, value ) );
231+
final var jdbcMapping = jdbcValueMapping.getJdbcMapping();
232+
jdbcParameterBindings.addBinding( jdbcParameter, new JdbcParameterBindingImpl( jdbcMapping, value ) );
234233
}
235234

236235
}

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66

77
import org.hibernate.engine.jdbc.Size;
88
import org.hibernate.metamodel.mapping.JdbcMapping;
9+
import org.hibernate.metamodel.mapping.SqlTypedMapping;
10+
11+
import org.checkerframework.checker.nullness.qual.Nullable;
912

1013
/**
1114
* A column in a IdTable. As these columns mirror the entity id columns, we know a few things about it inherently,
1215
* such as being non-nullable
1316
*
1417
* @author Steve Ebersole
1518
*/
16-
public class TemporaryTableColumn {
19+
public class TemporaryTableColumn implements SqlTypedMapping {
1720
private final TemporaryTable containingTable;
1821
private final String columnName;
1922
private final JdbcMapping jdbcMapping;
@@ -57,6 +60,7 @@ public String getColumnName() {
5760
return columnName;
5861
}
5962

63+
@Override
6064
public JdbcMapping getJdbcMapping() {
6165
return jdbcMapping;
6266
}
@@ -80,4 +84,34 @@ public boolean isNullable() {
8084
public boolean isPrimaryKey() {
8185
return primaryKey;
8286
}
87+
88+
@Override
89+
public @Nullable String getColumnDefinition() {
90+
return sqlTypeName;
91+
}
92+
93+
@Override
94+
public @Nullable Long getLength() {
95+
return size.getLength();
96+
}
97+
98+
@Override
99+
public @Nullable Integer getArrayLength() {
100+
return size.getArrayLength();
101+
}
102+
103+
@Override
104+
public @Nullable Integer getPrecision() {
105+
return size.getPrecision();
106+
}
107+
108+
@Override
109+
public @Nullable Integer getScale() {
110+
return size.getScale();
111+
}
112+
113+
@Override
114+
public @Nullable Integer getTemporalPrecision() {
115+
return getJdbcMapping().getJdbcType().isTemporal() ? size.getPrecision() : null;
116+
}
83117
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
3636
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
3737
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
38-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
38+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
3939
import org.hibernate.sql.exec.spi.Callback;
4040
import org.hibernate.sql.exec.spi.JdbcParameterBinding;
4141
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
@@ -355,7 +355,7 @@ void applyRestriction(
355355
predicateConsumer.accept( new NullnessPredicate( columnReference ) );
356356
}
357357
else {
358-
final var jdbcParameter = new JdbcParameterImpl( jdbcValueMapping.getJdbcMapping() );
358+
final var jdbcParameter = new SqlTypedMappingJdbcParameter( jdbcValueMapping );
359359
final var predicate =
360360
new ComparisonPredicate( columnReference, ComparisonOperator.EQUAL, jdbcParameter );
361361
predicateConsumer.accept( predicate );

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

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@
1616
import org.hibernate.loader.ast.spi.CollectionBatchLoader;
1717
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
1818
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
19-
import org.hibernate.metamodel.mapping.JdbcMapping;
2019
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
20+
import org.hibernate.metamodel.mapping.SqlTypedMapping;
21+
import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl;
2122
import org.hibernate.query.spi.QueryOptions;
2223
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
2324
import org.hibernate.sql.ast.tree.select.SelectStatement;
2425
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
2526
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
26-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
27+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
2728
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
2829
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
2930
import org.hibernate.sql.exec.spi.JdbcParametersList;
@@ -44,7 +45,7 @@ public class CollectionBatchLoaderArrayParam
4445
extends AbstractCollectionBatchLoader
4546
implements SqlArrayMultiKeyLoader {
4647

47-
private final JdbcMapping arrayJdbcMapping;
48+
private final SqlTypedMapping arraySqlTypedMapping;
4849
private final JdbcParameter jdbcParameter;
4950
private final SelectStatement sqlSelect;
5051
private final JdbcOperationQuerySelect jdbcSelectOperation;
@@ -64,16 +65,24 @@ public CollectionBatchLoaderArrayParam(
6465
}
6566

6667
final var keyDescriptor = getLoadable().getKeyDescriptor();
67-
final var jdbcMapping = keyDescriptor.getSingleJdbcMapping();
68+
final var selectable = keyDescriptor.getSelectable( 0 );
69+
final var jdbcMapping = selectable.getJdbcMapping();
6870
final var jdbcJavaTypeClass = jdbcMapping.getJdbcJavaType().getJavaTypeClass();
6971

70-
arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping(
71-
jdbcMapping,
72-
jdbcJavaTypeClass,
73-
getSessionFactory()
72+
arraySqlTypedMapping = new SqlTypedMappingImpl(
73+
selectable.getColumnDefinition(),
74+
selectable.getLength(),
75+
selectable.getPrecision(),
76+
selectable.getScale(),
77+
selectable.getTemporalPrecision(),
78+
MultiKeyLoadHelper.resolveArrayJdbcMapping(
79+
jdbcMapping,
80+
jdbcJavaTypeClass,
81+
getSessionFactory()
82+
)
7483
);
7584

76-
jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping );
85+
jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping );
7786
sqlSelect = LoaderSelectBuilder.createSelectBySingleArrayParameter(
7887
getLoadable(),
7988
keyDescriptor.getKeyPart(),
@@ -169,7 +178,7 @@ void initializeKeys(Object key, Object[] keysToInitialize, SharedSessionContract
169178
final var jdbcParameterBindings = new JdbcParameterBindingsImpl(1);
170179
jdbcParameterBindings.addBinding(
171180
jdbcParameter,
172-
new JdbcParameterBindingImpl( arrayJdbcMapping, keysToInitialize )
181+
new JdbcParameterBindingImpl( arraySqlTypedMapping.getJdbcMapping(), keysToInitialize )
173182
);
174183

175184
session.getJdbcServices().getJdbcSelectExecutor().list(

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import org.hibernate.sql.ast.tree.select.SelectStatement;
2525
import org.hibernate.sql.exec.internal.BaseExecutionContext;
2626
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
27-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
27+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
2828
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
2929
import org.hibernate.sql.exec.spi.JdbcParametersList;
3030
import org.hibernate.sql.results.graph.DomainResult;
@@ -100,7 +100,7 @@ class DatabaseSnapshotExecutor {
100100
final var tableReference =
101101
rootTableGroup.resolveTableReference( idNavigablePath,
102102
selection.getContainingTableExpression() );
103-
final var jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() );
103+
final var jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
104104
jdbcParametersBuilder.add( jdbcParameter );
105105
final var columnReference =
106106
(ColumnReference)

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

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@
1111
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1212
import org.hibernate.internal.build.AllowReflection;
1313
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
14-
import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping;
1514
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
1615
import org.hibernate.metamodel.mapping.EntityMappingType;
1716
import org.hibernate.metamodel.mapping.JdbcMapping;
17+
import org.hibernate.metamodel.mapping.SelectableMapping;
18+
import org.hibernate.metamodel.mapping.SqlTypedMapping;
19+
import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl;
1820
import org.hibernate.query.spi.QueryOptions;
1921
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
2022
import org.hibernate.sql.ast.tree.select.SelectStatement;
21-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
23+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
2224
import org.hibernate.sql.exec.internal.JdbcOperationQuerySelect;
2325

2426
import static org.hibernate.loader.ast.internal.LoaderHelper.loadByArrayParameter;
@@ -39,7 +41,7 @@ public class EntityBatchLoaderArrayParam<T>
3941
implements SqlArrayMultiKeyLoader {
4042
private final int domainBatchSize;
4143

42-
private final JdbcMapping arrayJdbcMapping;
44+
private final SqlTypedMapping arraySqlTypedMapping;
4345
private final JdbcParameter jdbcParameter;
4446
private final SelectStatement sqlAst;
4547
private final JdbcOperationQuerySelect jdbcSelectOperation;
@@ -70,14 +72,23 @@ public EntityBatchLoaderArrayParam(
7072
);
7173
}
7274

73-
final var identifierMapping = (BasicEntityIdentifierMapping) getLoadable().getIdentifierMapping();
74-
arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping(
75-
identifierMapping.getJdbcMapping(),
76-
identifierMapping.getJavaType().getJavaTypeClass(),
77-
sessionFactory
75+
final var identifierMapping = getLoadable().getIdentifierMapping();
76+
final SelectableMapping selectable = identifierMapping.getSelectable( 0 );
77+
final JdbcMapping jdbcMapping = selectable.getJdbcMapping();
78+
arraySqlTypedMapping = new SqlTypedMappingImpl(
79+
selectable.getColumnDefinition(),
80+
selectable.getLength(),
81+
selectable.getPrecision(),
82+
selectable.getScale(),
83+
selectable.getTemporalPrecision(),
84+
MultiKeyLoadHelper.resolveArrayJdbcMapping(
85+
jdbcMapping,
86+
jdbcMapping.getJdbcJavaType().getJavaTypeClass(),
87+
sessionFactory
88+
)
7889
);
7990

80-
jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping );
91+
jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping );
8192
sqlAst = LoaderSelectBuilder.createSelectBySingleArrayParameter(
8293
getLoadable(),
8394
identifierMapping,
@@ -132,7 +143,7 @@ protected void initializeEntities(
132143
sqlAst,
133144
jdbcSelectOperation,
134145
jdbcParameter,
135-
arrayJdbcMapping,
146+
arraySqlTypedMapping.getJdbcMapping(),
136147
id,
137148
entityInstance,
138149
getLoadable().getRootEntityDescriptor(),

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

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
import org.hibernate.sql.ast.tree.select.QueryPart;
5959
import org.hibernate.sql.ast.tree.select.QuerySpec;
6060
import org.hibernate.sql.ast.tree.select.SelectStatement;
61-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
61+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
6262
import org.hibernate.sql.results.graph.BiDirectionalFetch;
6363
import org.hibernate.sql.results.graph.DomainResult;
6464
import org.hibernate.sql.results.graph.EntityGraphTraversalState;
@@ -598,7 +598,7 @@ private void applyRestriction(
598598
(ColumnReference)
599599
sqlExpressionResolver.resolveSqlExpression( tableReference, selection );
600600
if ( numberOfKeysToLoad == 1 ) {
601-
final var jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() );
601+
final var jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
602602
jdbcParameterConsumer.accept( jdbcParameter );
603603
rootQuerySpec.applyPredicate(
604604
new ComparisonPredicate( columnRef, ComparisonOperator.EQUAL, jdbcParameter )
@@ -607,11 +607,9 @@ private void applyRestriction(
607607
else {
608608
final var predicate = new InListPredicate( columnRef );
609609
for ( int i = 0; i < numberOfKeysToLoad; i++ ) {
610-
for ( int j = 0; j < numberColumns; j++ ) {
611-
final var jdbcParameter = new JdbcParameterImpl( columnRef.getJdbcMapping() );
612-
jdbcParameterConsumer.accept( jdbcParameter );
613-
predicate.addExpression( jdbcParameter );
614-
}
610+
final var jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
611+
jdbcParameterConsumer.accept( jdbcParameter );
612+
predicate.addExpression( jdbcParameter );
615613
}
616614
rootQuerySpec.applyPredicate( predicate );
617615
}
@@ -638,12 +636,13 @@ private void applyRestriction(
638636

639637
for ( int i = 0; i < numberOfKeysToLoad; i++ ) {
640638
final List<JdbcParameter> tupleParams = new ArrayList<>( numberColumns );
641-
for ( int j = 0; j < numberColumns; j++ ) {
642-
final ColumnReference columnReference = columnReferences.get( j );
643-
final JdbcParameter jdbcParameter = new JdbcParameterImpl( columnReference.getJdbcMapping() );
644-
jdbcParameterConsumer.accept( jdbcParameter );
645-
tupleParams.add( jdbcParameter );
646-
}
639+
restrictedPart.forEachSelectable(
640+
(columnIndex, selection) -> {
641+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
642+
jdbcParameterConsumer.accept( jdbcParameter );
643+
tupleParams.add( jdbcParameter );
644+
}
645+
);
647646
final SqlTuple paramTuple = new SqlTuple( tupleParams, restrictedPart );
648647
predicate.addExpression( paramTuple );
649648
}

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

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@
1616
import org.hibernate.loader.ast.spi.MultiIdLoadOptions;
1717
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
1818
import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping;
19+
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
1920
import org.hibernate.metamodel.mapping.EntityMappingType;
2021
import org.hibernate.metamodel.mapping.JdbcMapping;
22+
import org.hibernate.metamodel.mapping.SelectableMapping;
23+
import org.hibernate.metamodel.mapping.SqlTypedMapping;
24+
import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl;
2125
import org.hibernate.query.spi.QueryOptions;
2226
import org.hibernate.query.spi.QueryOptionsAdapter;
2327
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
2428
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
2529
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
26-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
30+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
2731
import org.hibernate.sql.exec.spi.JdbcParametersList;
2832
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
2933
import org.hibernate.sql.results.spi.ManagedResultConsumer;
@@ -43,7 +47,7 @@
4347
*/
4448
public class MultiIdEntityLoaderArrayParam<E> extends AbstractMultiIdEntityLoader<E>
4549
implements SqlArrayMultiKeyLoader {
46-
private final JdbcMapping arrayJdbcMapping;
50+
private final SqlTypedMapping arraySqlTypedMapping;
4751
private final JdbcParameter jdbcParameter;
4852
protected final Object[] idArray;
4953

@@ -52,11 +56,24 @@ public MultiIdEntityLoaderArrayParam(
5256
EntityMappingType entityDescriptor,
5357
SessionFactoryImplementor sessionFactory) {
5458
super( entityDescriptor, sessionFactory );
59+
final EntityIdentifierMapping identifierMapping = entityDescriptor.getIdentifierMapping();
60+
final SelectableMapping selectable = identifierMapping.getSelectable( 0 );
61+
final JdbcMapping jdbcMapping = selectable.getJdbcMapping();
5562
final var idClass = identifierMapping.getJavaType().getJavaTypeClass();
5663
idArray = (Object[]) Array.newInstance( idClass, 0 );
57-
arrayJdbcMapping =
58-
resolveArrayJdbcMapping( getIdentifierMapping().getJdbcMapping(), idClass, getSessionFactory() );
59-
jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping );
64+
arraySqlTypedMapping = new SqlTypedMappingImpl(
65+
selectable.getColumnDefinition(),
66+
selectable.getLength(),
67+
selectable.getPrecision(),
68+
selectable.getScale(),
69+
selectable.getTemporalPrecision(),
70+
resolveArrayJdbcMapping(
71+
jdbcMapping,
72+
jdbcMapping.getJdbcJavaType().getJavaTypeClass(),
73+
sessionFactory
74+
)
75+
);
76+
jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping );
6077
}
6178

6279
@Override
@@ -90,8 +107,10 @@ protected void loadEntitiesById(
90107
);
91108

92109
final var bindings = new JdbcParameterBindingsImpl(1);
93-
bindings.addBinding( jdbcParameter,
94-
new JdbcParameterBindingImpl( arrayJdbcMapping, toIdArray( idsInBatch ) ) );
110+
bindings.addBinding(
111+
jdbcParameter,
112+
new JdbcParameterBindingImpl( arraySqlTypedMapping.getJdbcMapping(), toIdArray( idsInBatch ) )
113+
);
95114

96115
final var sqlAstTranslator =
97116
getSqlAstTranslatorFactory()
@@ -156,7 +175,7 @@ protected void loadEntitiesWithUnresolvedIds(
156175
sqlAst,
157176
jdbcSelectOperation,
158177
jdbcParameter,
159-
arrayJdbcMapping,
178+
arraySqlTypedMapping.getJdbcMapping(),
160179
null,
161180
null,
162181
null,

0 commit comments

Comments
 (0)