Skip to content

Commit cc02df7

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

14 files changed

+154
-103
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@
2727
import org.hibernate.sql.ast.spi.SimpleFromClauseAccessImpl;
2828
import org.hibernate.sql.ast.spi.SqlAliasBaseManager;
2929
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
30+
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
3031
import org.hibernate.sql.ast.tree.from.TableGroup;
3132
import org.hibernate.sql.ast.tree.predicate.ComparisonPredicate;
3233
import org.hibernate.sql.ast.tree.select.QuerySpec;
3334
import org.hibernate.sql.ast.tree.select.SelectStatement;
3435
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
3536
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
36-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
37+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
3738
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
3839
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
3940
import org.hibernate.sql.exec.spi.JdbcSelectExecutor;
@@ -209,8 +210,7 @@ private static void handleRestriction(
209210
LoaderSqlAstCreationState sqlAstCreationState,
210211
TableGroup rootTableGroup,
211212
JdbcParameterBindings jdbcParameterBindings) {
212-
final JdbcMapping jdbcMapping = jdbcValueMapping.getJdbcMapping();
213-
final JdbcParameterImpl jdbcParameter = new JdbcParameterImpl( jdbcMapping );
213+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( jdbcValueMapping );
214214
rootQuerySpec.applyPredicate(
215215
new ComparisonPredicate(
216216
sqlAstCreationState.getSqlExpressionResolver().resolveSqlExpression(
@@ -222,8 +222,8 @@ private static void handleRestriction(
222222
)
223223
);
224224

225-
final JdbcParameterBindingImpl jdbcParameterBinding = new JdbcParameterBindingImpl( jdbcMapping, value );
226-
jdbcParameterBindings.addBinding( jdbcParameter, jdbcParameterBinding );
225+
final JdbcMapping jdbcMapping = jdbcValueMapping.getJdbcMapping();
226+
jdbcParameterBindings.addBinding( jdbcParameter, new JdbcParameterBindingImpl( jdbcMapping, value ) );
227227
}
228228

229229
}

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
@@ -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,29 @@ 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 getPrecision() {
100+
return size.getPrecision();
101+
}
102+
103+
@Override
104+
public @Nullable Integer getScale() {
105+
return size.getScale();
106+
}
107+
108+
@Override
109+
public @Nullable Integer getTemporalPrecision() {
110+
return getJdbcMapping().getJdbcType().isTemporal() ? size.getPrecision() : null;
111+
}
83112
}

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
@@ -41,7 +41,7 @@
4141
import org.hibernate.sql.exec.internal.CallbackImpl;
4242
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
4343
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
44-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
44+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
4545
import org.hibernate.sql.exec.spi.Callback;
4646
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
4747
import org.hibernate.sql.exec.spi.JdbcParameterBinding;
@@ -357,7 +357,7 @@ void applyRestriction(
357357
predicateConsumer.accept( new NullnessPredicate( columnReference ) );
358358
}
359359
else {
360-
final JdbcParameter jdbcParameter = new JdbcParameterImpl( jdbcValueMapping.getJdbcMapping() );
360+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( jdbcValueMapping );
361361
final ComparisonPredicate predicate =
362362
new ComparisonPredicate( columnReference, ComparisonOperator.EQUAL, jdbcParameter );
363363
predicateConsumer.accept( predicate );

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,17 @@
1818
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
1919
import org.hibernate.metamodel.mapping.JdbcMapping;
2020
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
21+
import org.hibernate.metamodel.mapping.SelectableMapping;
22+
import org.hibernate.metamodel.mapping.SqlTypedMapping;
23+
import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl;
2124
import org.hibernate.query.spi.QueryOptions;
2225
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
2326
import org.hibernate.sql.ast.tree.from.TableGroup;
2427
import org.hibernate.sql.ast.tree.select.QuerySpec;
2528
import org.hibernate.sql.ast.tree.select.SelectStatement;
2629
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
2730
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
28-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
31+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
2932
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
3033
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
3134
import org.hibernate.sql.exec.spi.JdbcParametersList;
@@ -47,7 +50,7 @@ public class CollectionBatchLoaderArrayParam
4750
extends AbstractCollectionBatchLoader
4851
implements SqlArrayMultiKeyLoader {
4952
private final Class<?> keyDomainType;
50-
private final JdbcMapping arrayJdbcMapping;
53+
private final SqlTypedMapping arraySqlTypedMapping;
5154
private final JdbcParameter jdbcParameter;
5255
private final SelectStatement sqlSelect;
5356
private final JdbcOperationQuerySelect jdbcSelectOperation;
@@ -68,17 +71,25 @@ public CollectionBatchLoaderArrayParam(
6871
}
6972

7073
final ForeignKeyDescriptor keyDescriptor = getLoadable().getKeyDescriptor();
71-
final JdbcMapping jdbcMapping = keyDescriptor.getSingleJdbcMapping();
74+
final SelectableMapping selectable = keyDescriptor.getSelectable( 0 );
75+
final JdbcMapping jdbcMapping = selectable.getJdbcMapping();
7276
final Class<?> jdbcJavaTypeClass = jdbcMapping.getJdbcJavaType().getJavaTypeClass();
7377
keyDomainType = getKeyType( keyDescriptor.getKeyPart() );
7478

75-
arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping(
76-
jdbcMapping,
77-
jdbcJavaTypeClass,
78-
getSessionFactory()
79+
arraySqlTypedMapping = new SqlTypedMappingImpl(
80+
selectable.getColumnDefinition(),
81+
selectable.getLength(),
82+
selectable.getPrecision(),
83+
selectable.getScale(),
84+
selectable.getTemporalPrecision(),
85+
MultiKeyLoadHelper.resolveArrayJdbcMapping(
86+
jdbcMapping,
87+
jdbcJavaTypeClass,
88+
getSessionFactory()
89+
)
7990
);
8091

81-
jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping );
92+
jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping );
8293
sqlSelect = LoaderSelectBuilder.createSelectBySingleArrayParameter(
8394
getLoadable(),
8495
keyDescriptor.getKeyPart(),
@@ -178,7 +189,7 @@ void initializeKeys(Object key, Object[] keysToInitialize, SharedSessionContract
178189
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(1);
179190
jdbcParameterBindings.addBinding(
180191
jdbcParameter,
181-
new JdbcParameterBindingImpl( arrayJdbcMapping, keysToInitialize )
192+
new JdbcParameterBindingImpl( arraySqlTypedMapping.getJdbcMapping(), keysToInitialize )
182193
);
183194

184195
final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler(

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
@@ -32,7 +32,7 @@
3232
import org.hibernate.sql.ast.tree.select.SelectStatement;
3333
import org.hibernate.sql.exec.internal.BaseExecutionContext;
3434
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
35-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
35+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
3636
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
3737
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
3838
import org.hibernate.sql.exec.spi.JdbcParametersList;
@@ -110,7 +110,7 @@ class DatabaseSnapshotExecutor {
110110
selection.getContainingTableExpression()
111111
);
112112

113-
final JdbcParameter jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() );
113+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
114114
jdbcParametersBuilder.add( jdbcParameter );
115115

116116
final ColumnReference columnReference = (ColumnReference) sqlExpressionResolver

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

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@
1414
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1515
import org.hibernate.internal.build.AllowReflection;
1616
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
17-
import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping;
1817
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
1918
import org.hibernate.metamodel.mapping.EntityMappingType;
2019
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;
2123
import org.hibernate.persister.entity.EntityPersister;
2224
import org.hibernate.query.spi.QueryOptions;
2325
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
2426
import org.hibernate.sql.ast.tree.select.SelectStatement;
25-
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
implements SqlArrayMultiKeyLoader {
4446
private final int domainBatchSize;
4547

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;
@@ -76,14 +78,23 @@ public EntityBatchLoaderArrayParam(
7678
);
7779
}
7880

79-
identifierMapping = (BasicEntityIdentifierMapping) getLoadable().getIdentifierMapping();
80-
arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping(
81-
identifierMapping.getJdbcMapping(),
82-
identifierMapping.getJavaType().getJavaTypeClass(),
83-
sessionFactory
81+
identifierMapping = getLoadable().getIdentifierMapping();
82+
final SelectableMapping selectable = identifierMapping.getSelectable( 0 );
83+
final JdbcMapping jdbcMapping = selectable.getJdbcMapping();
84+
arraySqlTypedMapping = new SqlTypedMappingImpl(
85+
selectable.getColumnDefinition(),
86+
selectable.getLength(),
87+
selectable.getPrecision(),
88+
selectable.getScale(),
89+
selectable.getTemporalPrecision(),
90+
MultiKeyLoadHelper.resolveArrayJdbcMapping(
91+
jdbcMapping,
92+
jdbcMapping.getJdbcJavaType().getJavaTypeClass(),
93+
sessionFactory
94+
)
8495
);
8596

86-
jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping );
97+
jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping );
8798
sqlAst = LoaderSelectBuilder.createSelectBySingleArrayParameter(
8899
getLoadable(),
89100
identifierMapping,
@@ -140,7 +151,7 @@ protected void initializeEntities(
140151
sqlAst,
141152
jdbcSelectOperation,
142153
jdbcParameter,
143-
arrayJdbcMapping,
154+
arraySqlTypedMapping.getJdbcMapping(),
144155
id,
145156
entityInstance,
146157
getLoadable().getRootEntityDescriptor(),

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

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
import org.hibernate.sql.ast.tree.select.QueryPart;
7171
import org.hibernate.sql.ast.tree.select.QuerySpec;
7272
import org.hibernate.sql.ast.tree.select.SelectStatement;
73-
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
73+
import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter;
7474
import org.hibernate.sql.results.graph.BiDirectionalFetch;
7575
import org.hibernate.sql.results.graph.DomainResult;
7676
import org.hibernate.sql.results.graph.EntityGraphTraversalState;
@@ -613,7 +613,7 @@ private void applyRestriction(
613613
(ColumnReference)
614614
sqlExpressionResolver.resolveSqlExpression( tableReference, selection );
615615
if ( numberOfKeysToLoad == 1 ) {
616-
final JdbcParameter jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() );
616+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
617617
jdbcParameterConsumer.accept( jdbcParameter );
618618

619619
rootQuerySpec.applyPredicate(
@@ -623,12 +623,10 @@ private void applyRestriction(
623623
else {
624624
final InListPredicate predicate = new InListPredicate( columnRef );
625625
for ( int i = 0; i < numberOfKeysToLoad; i++ ) {
626-
for ( int j = 0; j < numberColumns; j++ ) {
627-
final JdbcParameter jdbcParameter =
628-
new JdbcParameterImpl( columnRef.getJdbcMapping() );
629-
jdbcParameterConsumer.accept( jdbcParameter );
630-
predicate.addExpression( jdbcParameter );
631-
}
626+
final JdbcParameter jdbcParameter =
627+
new SqlTypedMappingJdbcParameter( selection );
628+
jdbcParameterConsumer.accept( jdbcParameter );
629+
predicate.addExpression( jdbcParameter );
632630
}
633631
rootQuerySpec.applyPredicate( predicate );
634632
}
@@ -656,12 +654,13 @@ private void applyRestriction(
656654

657655
for ( int i = 0; i < numberOfKeysToLoad; i++ ) {
658656
final List<JdbcParameter> tupleParams = new ArrayList<>( numberColumns );
659-
for ( int j = 0; j < numberColumns; j++ ) {
660-
final ColumnReference columnReference = columnReferences.get( j );
661-
final JdbcParameter jdbcParameter = new JdbcParameterImpl( columnReference.getJdbcMapping() );
662-
jdbcParameterConsumer.accept( jdbcParameter );
663-
tupleParams.add( jdbcParameter );
664-
}
657+
restrictedPart.forEachSelectable(
658+
(columnIndex, selection) -> {
659+
final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection );
660+
jdbcParameterConsumer.accept( jdbcParameter );
661+
tupleParams.add( jdbcParameter );
662+
}
663+
);
665664
final SqlTuple paramTuple = new SqlTuple( tupleParams, restrictedPart );
666665
predicate.addExpression( paramTuple );
667666
}

0 commit comments

Comments
 (0)