Skip to content

Commit 8910c78

Browse files
committed
HHH-18860 Store SelectableMapping in ColumnWriteFragment to allow precise parameter casts
1 parent ad91f94 commit 8910c78

25 files changed

+191
-303
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SoftDeleteMappingImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,17 +210,17 @@ public Predicate createNonDeletedRestriction(TableReference tableReference, SqlE
210210
public ColumnValueBinding createNonDeletedValueBinding(ColumnReference softDeleteColumnReference) {
211211
final var nonDeletedFragment =
212212
strategy == SoftDeleteType.TIMESTAMP
213-
? new ColumnWriteFragment( null, emptyList(), jdbcMapping )
214-
: new ColumnWriteFragment( nonDeletedLiteralText, emptyList(), jdbcMapping );
213+
? new ColumnWriteFragment( null, emptyList(), this )
214+
: new ColumnWriteFragment( nonDeletedLiteralText, emptyList(), this );
215215
return new ColumnValueBinding( softDeleteColumnReference, nonDeletedFragment );
216216
}
217217

218218
@Override
219219
public ColumnValueBinding createDeletedValueBinding(ColumnReference softDeleteColumnReference) {
220220
final ColumnWriteFragment deletedFragment =
221221
strategy == SoftDeleteType.TIMESTAMP
222-
? new ColumnWriteFragment( currentTimestampFunctionName, emptyList(), getJdbcMapping() )
223-
: new ColumnWriteFragment( deletedLiteralText, emptyList(), jdbcMapping );
222+
? new ColumnWriteFragment( currentTimestampFunctionName, emptyList(), this )
223+
: new ColumnWriteFragment( deletedLiteralText, emptyList(), this );
224224
return new ColumnValueBinding( softDeleteColumnReference, deletedFragment );
225225
}
226226

hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1739,20 +1739,20 @@ protected void applyKeyRestrictions(
17391739
List<ColumnValueBinding> restrictionBindings) {
17401740
final var foreignKeyDescriptor = getAttributeMapping().getKeyDescriptor();
17411741
assert foreignKeyDescriptor != null;
1742-
foreignKeyDescriptor.getKeyPart().forEachSelectable( parameterList );
1743-
for ( var columnValueParameter : parameterList ) {
1742+
foreignKeyDescriptor.getKeyPart().forEachSelectable( (selectionIndex, selectableMapping) -> {
1743+
final var columnValueParameter = parameterList.addColumValueParameter( selectableMapping );
17441744
final var columnReference = columnValueParameter.getColumnReference();
17451745
restrictionBindings.add(
17461746
new ColumnValueBinding(
17471747
columnReference,
17481748
new ColumnWriteFragment(
17491749
"?",
17501750
columnValueParameter,
1751-
columnReference.getJdbcMapping()
1751+
selectableMapping
17521752
)
17531753
)
17541754
);
1755-
}
1755+
});
17561756
}
17571757

17581758

hibernate-core/src/main/java/org/hibernate/persister/collection/OneToManyPersister.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -296,34 +296,34 @@ public RestrictedTableMutation<JdbcMutationOperation> generateDeleteAllAst(Mutat
296296
new ColumnValueParameterList( tableReference, ParameterUsage.RESTRICT, keyColumnCount );
297297
final List<ColumnValueBinding> keyRestrictionBindings = arrayList( keyColumnCount );
298298
final List<ColumnValueBinding> valueBindings = arrayList( valuesCount );
299-
foreignKeyDescriptor.getKeyPart().forEachSelectable( parameterBinders );
300-
for ( var columnValueParameter : parameterBinders ) {
299+
foreignKeyDescriptor.getKeyPart().forEachSelectable( (selectionIndex, selectableMapping) -> {
300+
final var columnValueParameter = parameterBinders.addColumValueParameter( selectableMapping );
301301
final var columnReference = columnValueParameter.getColumnReference();
302302
keyRestrictionBindings.add(
303303
new ColumnValueBinding(
304304
columnReference,
305305
new ColumnWriteFragment(
306306
"?",
307307
columnValueParameter,
308-
columnReference.getJdbcMapping()
308+
selectableMapping
309309
)
310310
)
311311
);
312312
valueBindings.add(
313313
new ColumnValueBinding(
314314
columnReference,
315-
new ColumnWriteFragment( "null", columnReference.getJdbcMapping() )
315+
new ColumnWriteFragment( "null", selectableMapping )
316316
)
317317
);
318-
}
318+
} );
319319

320320
if ( hasIndex() && !indexContainsFormula ) {
321321
attributeMapping.getIndexDescriptor().forEachSelectable( (selectionIndex, selectableMapping) -> {
322322
if ( selectableMapping.isUpdateable() ) {
323323
valueBindings.add(
324324
new ColumnValueBinding(
325325
new ColumnReference( tableReference, selectableMapping ),
326-
new ColumnWriteFragment( "null", selectableMapping.getJdbcMapping() )
326+
new ColumnWriteFragment( "null", selectableMapping )
327327
)
328328
);
329329
}
@@ -484,10 +484,8 @@ public RestrictedTableMutation<JdbcMutationOperation> generateDeleteRowAst(Mutat
484484
if ( selectable.isUpdateable() ) {
485485
// set null
486486
updateBuilder.addValueColumn(
487-
selectable.getSelectionExpression(),
488487
NULL,
489-
selectable.getJdbcMapping(),
490-
selectable.isLob()
488+
selectable
491489
);
492490
}
493491
// restrict
@@ -504,10 +502,8 @@ public RestrictedTableMutation<JdbcMutationOperation> generateDeleteRowAst(Mutat
504502
final var selectable = indexDescriptor.getSelectable( i );
505503
if ( selectable.isUpdateable() ) {
506504
updateBuilder.addValueColumn(
507-
selectable.getSelectionExpression(),
508505
NULL,
509-
selectable.getJdbcMapping(),
510-
selectable.isLob()
506+
selectable
511507
);
512508
}
513509
}

hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3356,10 +3356,7 @@ protected EntityTableMapping[] buildTableMappings() {
33563356
.accept( (selectionIndex, selectableMapping) -> {
33573357
keyColumns.add( new EntityTableMapping.KeyColumn(
33583358
tableExpression,
3359-
selectableMapping.getSelectionExpression(),
3360-
selectableMapping.getWriteExpression(),
3361-
selectableMapping.isFormula(),
3362-
selectableMapping.getJdbcMapping()
3359+
selectableMapping
33633360
) );
33643361
} );
33653362

hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -742,9 +742,8 @@ public void addDiscriminatorToInsertGroup(MutationGroupBuilder insertGroupBuilde
742742
final TableInsertBuilder tableInsertBuilder =
743743
insertGroupBuilder.getTableDetailsBuilder( getRootTableName() );
744744
tableInsertBuilder.addValueColumn(
745-
explicitDiscriminatorColumnName,
746745
getDiscriminatorValueString(),
747-
getDiscriminatorMapping().getJdbcMapping()
746+
getDiscriminatorMapping()
748747
);
749748
}
750749
}

hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,9 +471,8 @@ public void addDiscriminatorToInsertGroup(MutationGroupBuilder insertGroupBuilde
471471
final TableInsertBuilder tableInsertBuilder =
472472
insertGroupBuilder.getTableDetailsBuilder( getRootTableName() );
473473
tableInsertBuilder.addValueColumn(
474-
discriminatorColumnName,
475474
discriminatorValue == NULL_DISCRIMINATOR ? NULL : discriminatorSQLValue,
476-
getDiscriminatorMapping().getJdbcMapping()
475+
getDiscriminatorMapping()
477476
);
478477
}
479478
}

hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractMutationCoordinator.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,8 @@ protected void handleValueGeneration(
132132
final String tableName = entityPersister.physicalTableNameForMutation( mapping );
133133
final ColumnValuesTableMutationBuilder tableUpdateBuilder = mutationGroupBuilder.findTableDetailsBuilder( tableName );
134134
tableUpdateBuilder.addValueColumn(
135-
mapping.getSelectionExpression(),
136135
writePropertyValue ? "?" : columnValues[j],
137-
mapping.getJdbcMapping(),
138-
mapping.isLob()
136+
mapping
139137
);
140138
} );
141139
}

hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/EntityTableMapping.java

Lines changed: 25 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,17 @@
44
*/
55
package org.hibernate.persister.entity.mutation;
66

7-
import org.checkerframework.checker.nullness.qual.Nullable;
87
import org.hibernate.engine.spi.SharedSessionContractImplementor;
98
import org.hibernate.internal.util.collections.ArrayHelper;
109
import org.hibernate.jdbc.Expectation;
1110
import org.hibernate.metamodel.mapping.BasicValuedModelPart;
1211
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
13-
import org.hibernate.metamodel.mapping.JdbcMapping;
1412
import org.hibernate.metamodel.mapping.ModelPart;
1513
import org.hibernate.metamodel.mapping.SelectableConsumer;
1614
import org.hibernate.metamodel.mapping.SelectableMapping;
1715
import org.hibernate.metamodel.mapping.SelectableMappings;
1816
import org.hibernate.metamodel.mapping.TableDetails;
17+
import org.hibernate.metamodel.mapping.internal.SelectableMappingImpl;
1918
import org.hibernate.spi.NavigablePath;
2019
import org.hibernate.sql.ast.spi.SqlAstCreationState;
2120
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
@@ -384,118 +383,33 @@ public <K> DomainResult<K> createDomainResult(
384383
}
385384
}
386385

387-
public static class KeyColumn implements TableDetails.KeyColumn {
388-
private final String tableName;
389-
private final String columnName;
390-
private final String writeExpression;
391-
392-
private final boolean formula;
393-
394-
private final JdbcMapping jdbcMapping;
395-
396-
public KeyColumn(
397-
String tableName,
398-
String columnName,
399-
String writeExpression,
400-
boolean formula,
401-
JdbcMapping jdbcMapping) {
402-
this.tableName = tableName;
403-
this.columnName = columnName;
404-
this.writeExpression = writeExpression;
405-
this.formula = formula;
406-
this.jdbcMapping = jdbcMapping;
407-
}
408-
409-
public String getColumnName() {
410-
return columnName;
411-
}
412-
413-
@Override
414-
public String getContainingTableExpression() {
415-
return tableName;
416-
}
417-
418-
@Override
419-
public String getWriteExpression() {
420-
return writeExpression;
421-
}
422-
423-
@Override
424-
public String getSelectionExpression() {
425-
return columnName;
426-
}
427-
428-
@Override
429-
public JdbcMapping getJdbcMapping() {
430-
return jdbcMapping;
431-
}
432-
433-
@Override
434-
public boolean isFormula() {
435-
return formula;
436-
}
437-
438-
@Override
439-
public boolean isNullable() {
440-
// keys are never nullable
441-
return false;
442-
}
443-
444-
@Override
445-
public boolean isInsertable() {
446-
// keys are always insertable, unless this "column" is a formula
447-
return !formula;
448-
}
449-
450-
@Override
451-
public boolean isUpdateable() {
452-
// keys are never updateable
453-
return false;
454-
}
455-
456-
@Override
457-
public boolean isPartitioned() {
458-
return false;
459-
}
460-
461-
@Override
462-
public @Nullable String getColumnDefinition() {
463-
return null;
464-
}
465-
466-
@Override
467-
public @Nullable Long getLength() {
468-
return null;
469-
}
470-
471-
@Override
472-
public @Nullable Integer getArrayLength() {
473-
return null;
474-
}
475-
476-
@Override
477-
public @Nullable Integer getPrecision() {
478-
return null;
479-
}
480-
481-
@Override
482-
public @Nullable Integer getScale() {
483-
return null;
484-
}
485-
486-
@Override
487-
public @Nullable Integer getTemporalPrecision() {
488-
return null;
489-
}
490-
491-
@Override
492-
public @Nullable String getCustomReadExpression() {
493-
return null;
386+
public static class KeyColumn extends SelectableMappingImpl implements TableDetails.KeyColumn {
387+
388+
public KeyColumn(String tableName, SelectableMapping originalMapping) {
389+
super(
390+
tableName,
391+
originalMapping.getSelectionExpression(),
392+
originalMapping.getSelectablePath(),
393+
originalMapping.getCustomReadExpression(),
394+
originalMapping.getCustomWriteExpression(),
395+
originalMapping.getColumnDefinition(),
396+
originalMapping.getLength(),
397+
originalMapping.getPrecision(),
398+
originalMapping.getScale(),
399+
originalMapping.getTemporalPrecision(),
400+
originalMapping.isLob(),
401+
originalMapping.isNullable(),
402+
originalMapping.isInsertable(),
403+
originalMapping.isUpdateable(),
404+
originalMapping.isPartitioned(),
405+
originalMapping.isFormula(),
406+
originalMapping.getJdbcMapping()
407+
);
494408
}
495409

496410
@Override
497-
public @Nullable String getCustomWriteExpression() {
498-
return null;
411+
public String getColumnName() {
412+
return getSelectionExpression();
499413
}
500414
}
501415
}

hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/InsertCoordinatorStandard.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.hibernate.generator.values.GeneratedValuesMutationDelegate;
2727
import org.hibernate.metamodel.mapping.AttributeMapping;
2828
import org.hibernate.metamodel.mapping.AttributeMappingsList;
29-
import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping;
3029
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
3130
import org.hibernate.persister.entity.EntityPersister;
3231
import org.hibernate.sql.model.MutationOperation;
@@ -429,14 +428,11 @@ else if ( isValueGenerationInSql( generator, factory.getJdbcServices().getDialec
429428
assert entityPersister().getInsertDelegate() != null;
430429
final OnExecutionGenerator generator = (OnExecutionGenerator) entityPersister().getGenerator();
431430
if ( generator.referenceColumnsInSql( dialect ) ) {
432-
final BasicEntityIdentifierMapping identifierMapping = (BasicEntityIdentifierMapping) entityPersister().getIdentifierMapping();
433431
final String[] columnValues = generator.getReferencedColumnValues( dialect );
434432
if ( columnValues != null ) {
435-
tableMapping.getKeyMapping().forEachKeyColumn( (i, column) -> tableInsertBuilder.addKeyColumn(
436-
column.getColumnName(),
437-
columnValues[i],
438-
identifierMapping.getJdbcMapping()
439-
) );
433+
assert columnValues.length == 1;
434+
assert tableMapping.getKeyMapping().getColumnCount() == 1;
435+
tableInsertBuilder.addKeyColumn( columnValues[0], tableMapping.getKeyMapping().getKeyColumn( 0 ) );
440436
}
441437
}
442438
}

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@
120120
import org.hibernate.sql.ast.tree.expression.SqlSelectionExpression;
121121
import org.hibernate.sql.ast.tree.expression.SqlTuple;
122122
import org.hibernate.sql.ast.tree.expression.SqlTupleContainer;
123+
import org.hibernate.sql.ast.tree.expression.SqlTypedExpression;
123124
import org.hibernate.sql.ast.tree.expression.Star;
124125
import org.hibernate.sql.ast.tree.expression.Summarization;
125126
import org.hibernate.sql.ast.tree.expression.TrimSpecification;
@@ -5664,10 +5665,10 @@ protected void renderCasted(Expression expression) {
56645665
final List<SqlAstNode> arguments = new ArrayList<>( 2 );
56655666
arguments.add( expression );
56665667
final CastTarget castTarget;
5667-
if ( expression instanceof SqlTypedMappingJdbcParameter parameter ) {
5668-
final SqlTypedMapping sqlTypedMapping = parameter.getSqlTypedMapping();
5668+
if ( expression instanceof SqlTypedExpression sqlTypedExpression ) {
5669+
final SqlTypedMapping sqlTypedMapping = sqlTypedExpression.getSqlTypedMapping();
56695670
castTarget = new CastTarget(
5670-
parameter.getJdbcMapping(),
5671+
sqlTypedMapping.getJdbcMapping(),
56715672
sqlTypedMapping.getColumnDefinition(),
56725673
sqlTypedMapping.getLength(),
56735674
sqlTypedMapping.getArrayLength(),

0 commit comments

Comments
 (0)