diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/implicit/ImplicitResultClassBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/results/implicit/ImplicitResultClassBuilder.java index e9fe15cce5..7726e02a53 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/implicit/ImplicitResultClassBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/implicit/ImplicitResultClassBuilder.java @@ -8,9 +8,13 @@ package org.hibernate.query.results.implicit; import java.util.function.BiFunction; -import org.hibernate.metamodel.spi.MappingMetamodelImplementor; +import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.query.results.ResultBuilder; +import org.hibernate.query.results.ResultSetMappingSqlSelection; import org.hibernate.query.results.dynamic.DynamicFetchBuilderLegacy; +import org.hibernate.sql.ast.spi.SqlExpressionResolver; +import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.basic.BasicResult; @@ -39,23 +43,34 @@ public class ImplicitResultClassBuilder implements ResultBuilder { int resultPosition, BiFunction legacyFetchResolver, DomainResultCreationState domainResultCreationState) { - final MappingMetamodelImplementor mappingMetamodel = domainResultCreationState.getSqlAstCreationState() - .getCreationContext() - .getMappingMetamodel(); - final TypeConfiguration typeConfiguration = mappingMetamodel.getTypeConfiguration(); - final int jdbcResultPosition = resultPosition + 1; + assert resultPosition == 0; - final BasicType basicType = jdbcResultsMetadata.resolveType( + final SessionFactoryImplementor sessionFactory = domainResultCreationState.getSqlAstCreationState() + .getCreationContext() + .getSessionFactory(); + final TypeConfiguration typeConfiguration = sessionFactory.getTypeConfiguration(); + final SqlExpressionResolver sqlExpressionResolver = domainResultCreationState.getSqlAstCreationState().getSqlExpressionResolver(); + + final int jdbcResultPosition = 1; + + final String columnName = jdbcResultsMetadata.resolveColumnName( jdbcResultPosition ); + final BasicType basicType = jdbcResultsMetadata.resolveType( jdbcResultPosition, typeConfiguration.getJavaTypeRegistry().resolveDescriptor( suppliedResultClass ), typeConfiguration ); - return new BasicResult<>( - resultPosition, - jdbcResultsMetadata.resolveColumnName( jdbcResultPosition ), - basicType + final SqlSelection selection = sqlExpressionResolver.resolveSqlSelection( + sqlExpressionResolver.resolveSqlExpression( + SqlExpressionResolver.createColumnReferenceKey( columnName ), + (state) -> new ResultSetMappingSqlSelection( resultPosition, (BasicValuedMapping) basicType ) + ), + basicType.getMappedJavaType(), + null, + typeConfiguration ); + + return new BasicResult<>( selection.getValuesArrayPosition(), columnName, basicType ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NamedNativeQueryMementoImpl.java b/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NamedNativeQueryMementoImpl.java index fa34114f44..8ba29214b4 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NamedNativeQueryMementoImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NamedNativeQueryMementoImpl.java @@ -12,7 +12,6 @@ import java.util.Set; import org.hibernate.CacheMode; import org.hibernate.FlushMode; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.query.named.AbstractNamedQueryMemento; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sql.spi.NamedNativeQueryMemento; @@ -128,7 +127,7 @@ public class NamedNativeQueryMementoImpl extends AbstractNamedQueryMemento imple originalSqlString, resultSetMappingName, resultSetMappingClass, - CollectionHelper.makeCopy( querySpaces ), + querySpaces, getCacheable(), getCacheRegion(), getCacheMode(), diff --git a/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeQueryImpl.java b/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeQueryImpl.java index ffcb8befc9..df9c33707f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeQueryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeQueryImpl.java @@ -856,7 +856,7 @@ public class NativeQueryImpl } public void addResultTypeClass(Class resultClass) { - assert CollectionHelper.isEmpty( resultSetMapping.getResultBuilders() ); + assert resultSetMapping.getNumberOfResultBuilders() == 0; registerBuilder( Builders.resultClassBuilder( resultClass, getSessionFactory() ) ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/NativeQuerySchemaPlaceholderTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/NativeQuerySchemaPlaceholderTest.java index e0df38c7da..e1268937fa 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/NativeQuerySchemaPlaceholderTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/NativeQuerySchemaPlaceholderTest.java @@ -71,7 +71,8 @@ public class NativeQuerySchemaPlaceholderTest { scope.inTransaction( session -> { NativeQueryImplementor nativeQuery = session.createNativeQuery( - "select id from {h-schema}TestEntity", Long.class + "select id from {h-schema}TestEntity", + Long.class ); List results = nativeQuery.list(); assertThat( results.get( 0 ), is( 1l ) );