diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java index 827d39224c5b..6dc2d168d8cc 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java @@ -344,8 +344,9 @@ private JavaType tenantIdentifierType(SessionFactoryOptions options) { else { final var jdbcMapping = tenantFilter.getParameterJdbcMapping( TenantIdBinder.PARAMETER_NAME ); assert jdbcMapping != null; + //NOTE: this is completely unsound //noinspection unchecked - return jdbcMapping.getJavaTypeDescriptor(); + return (JavaType) jdbcMapping.getJavaTypeDescriptor(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/JdbcMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/JdbcMapping.java index 77d2720a812f..c05ddd5d560d 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/JdbcMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/JdbcMapping.java @@ -54,7 +54,7 @@ public interface JdbcMapping extends MappingType, JdbcMappingContainer { * The descriptor for the Java type represented by this * expressible type */ - JavaType getJavaTypeDescriptor(); + JavaType getJavaTypeDescriptor(); /** * The descriptor for the SQL type represented by this diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedConverted.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedConverted.java index dcde5a9c6c8e..7ef959977102 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedConverted.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedConverted.java @@ -46,14 +46,14 @@ public CompleteResultBuilderBasicValuedConverted( BasicValuedMapping underlyingMapping) { this.explicitColumnName = explicitColumnName; this.underlyingMapping = underlyingMapping; - @SuppressWarnings("unchecked") - final JavaType relationalType = - underlyingMapping.getJdbcMapping().getJavaTypeDescriptor(); + final JavaType relationalType = + underlyingMapping.getJdbcMapping() + .getJavaTypeDescriptor(); this.valueConverter = new AttributeConverterBean<>( converterBean, converterJtd, domainJavaType, - relationalType + (JavaType) relationalType ); } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/JdbcLiteral.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/JdbcLiteral.java index c5a7295d57a2..34ede813722d 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/JdbcLiteral.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/JdbcLiteral.java @@ -78,7 +78,7 @@ public void bindParameterValue( // MappingModelExpressible @Override - public MappingModelExpressible getExpressionType() { + public MappingModelExpressible getExpressionType() { return this; } @@ -184,6 +184,7 @@ public void applySqlSelections(DomainResultCreationState creationState) { @Override public JavaType getExpressibleJavaType() { - return jdbcMapping.getJavaTypeDescriptor(); + return (JavaType) + jdbcMapping.getJavaTypeDescriptor(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/AbstractJdbcOperationQuery.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/AbstractJdbcOperationQuery.java index 50541b86e9bd..e111c2a17e7c 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/AbstractJdbcOperationQuery.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/AbstractJdbcOperationQuery.java @@ -14,6 +14,7 @@ import org.hibernate.sql.exec.spi.JdbcParameterBinder; import org.hibernate.sql.exec.spi.JdbcParameterBinding; import org.hibernate.sql.exec.spi.JdbcParameterBindings; +import org.hibernate.type.descriptor.java.JavaType; import static java.util.Collections.emptyMap; @@ -78,16 +79,20 @@ public boolean isCompatibleWith(JdbcParameterBindings jdbcParameterBindings, Que return false; } for ( var entry : appliedParameters.entrySet() ) { - final JdbcParameterBinding binding = jdbcParameterBindings.getBinding( entry.getKey() ); - final JdbcParameterBinding appliedBinding = entry.getValue(); - //noinspection unchecked - if ( binding == null || !appliedBinding.getBindType() - .getJavaTypeDescriptor() - .areEqual( binding.getBindValue(), appliedBinding.getBindValue() ) ) { + final var binding = jdbcParameterBindings.getBinding( entry.getKey() ); + final var appliedBinding = entry.getValue(); + if ( binding == null + || !equal( appliedBinding, binding, appliedBinding.getBindType().getJavaTypeDescriptor() ) ) { return false; } } } return true; } + + @SuppressWarnings("unchecked") + static boolean equal(JdbcParameterBinding appliedBinding, JdbcParameterBinding binding, JavaType type) { + return type.isInstance( appliedBinding.getBindValue() ) + && type.areEqual( (T) binding.getBindValue(), (T) appliedBinding.getBindValue() ); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcOperationQuerySelect.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcOperationQuerySelect.java index 61893f9bd8c5..97b256fe1ed3 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcOperationQuerySelect.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcOperationQuerySelect.java @@ -17,7 +17,6 @@ import org.hibernate.sql.exec.spi.JdbcSelect; import org.hibernate.sql.exec.spi.LoadedValuesCollector; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducer; -import org.hibernate.type.descriptor.java.JavaType; import java.sql.Connection; import java.util.Collections; @@ -159,7 +158,8 @@ else if ( jdbcParameterBindings.getBinding( parameter ) == null ) { if ( parameter != offsetParameter && parameter != limitParameter ) { final JdbcParameterBinding binding = jdbcParameterBindings.getBinding( parameter ); // TODO: appliedBinding can be null here, resulting in NPE - if ( binding == null || !areEqualBindings( appliedBinding, binding ) ) { + if ( binding == null + || !equal( appliedBinding, binding, appliedBinding.getBindType().getJavaTypeDescriptor() ) ) { return false; } } @@ -171,11 +171,6 @@ && isCompatible( offsetParameter, limit == null ? null : limit.getFirstRow(), 0 && isCompatible( limitParameter, limit == null ? null : limit.getMaxRows(), Integer.MAX_VALUE ); } - private static boolean areEqualBindings(JdbcParameterBinding appliedBinding, JdbcParameterBinding binding) { - final JavaType javaTypeDescriptor = appliedBinding.getBindType().getJavaTypeDescriptor(); - return javaTypeDescriptor.areEqual( binding.getBindValue(), appliedBinding.getBindValue() ); - } - private boolean isCompatible(JdbcParameter parameter, Integer requestedValue, int defaultValue) { if ( parameter == null ) { return requestedValue == null; diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicResult.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicResult.java index 1bba9ceb8ed1..60d2b118f341 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicResult.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/basic/BasicResult.java @@ -54,9 +54,8 @@ public BasicResult( this( jdbcValuesArrayPosition, resultVariable, - jdbcMapping.getJavaTypeDescriptor(), - (BasicValueConverter) - jdbcMapping.getValueConverter(), + (JavaType) jdbcMapping.getJavaTypeDescriptor(), + (BasicValueConverter) jdbcMapping.getValueConverter(), navigablePath, coerceResultType, unwrapRowProcessingState @@ -67,20 +66,25 @@ public BasicResult( int valuesArrayPosition, String resultVariable, JavaType javaType, - BasicValueConverter valueConverter, + BasicValueConverter converter, NavigablePath navigablePath, boolean coerceResultType, boolean unwrapRowProcessingState) { this.resultVariable = resultVariable; this.javaType = javaType; this.navigablePath = navigablePath; + this.assembler = assembler( valuesArrayPosition, javaType, converter, coerceResultType, unwrapRowProcessingState ); + } - if ( coerceResultType ) { - this.assembler = new CoercingResultAssembler<>( valuesArrayPosition, javaType, valueConverter, unwrapRowProcessingState ); - } - else { - this.assembler = new BasicResultAssembler<>( valuesArrayPosition, javaType, valueConverter, unwrapRowProcessingState ); - } + private static BasicResultAssembler assembler( + int valuesArrayPosition, + JavaType javaType, + BasicValueConverter converter, + boolean coerceResultType, + boolean unwrapRowProcessingState) { + return coerceResultType + ? new CoercingResultAssembler<>( valuesArrayPosition, javaType, converter, unwrapRowProcessingState ) + : new BasicResultAssembler<>( valuesArrayPosition, javaType, converter, unwrapRowProcessingState ); } @Override