diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqmToSqlAstConverter.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqmToSqlAstConverter.java index 8db771321b7b..387732544b0a 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqmToSqlAstConverter.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqmToSqlAstConverter.java @@ -50,11 +50,11 @@ public InformixSqmToSqlAstConverter( @Override public QuerySpec visitQuerySpec(SqmQuerySpec sqmQuerySpec) { - final boolean needsDummy = this.needsDummyTableGroup; - this.needsDummyTableGroup = false; + final boolean needsDummy = needsDummyTableGroup; + needsDummyTableGroup = false; try { final QuerySpec querySpec = super.visitQuerySpec( sqmQuerySpec ); - if ( this.needsDummyTableGroup ) { + if ( needsDummyTableGroup ) { querySpec.getFromClause().addRoot( new StandardTableGroup( true, @@ -70,7 +70,7 @@ public QuerySpec visitQuerySpec(SqmQuerySpec sqmQuerySpec) { return querySpec; } finally { - this.needsDummyTableGroup = needsDummy; + needsDummyTableGroup = needsDummy; } } diff --git a/hibernate-core/src/main/java/org/hibernate/SessionFactory.java b/hibernate-core/src/main/java/org/hibernate/SessionFactory.java index 1f0e2f9b7e4e..e72a3fef6ffb 100644 --- a/hibernate-core/src/main/java/org/hibernate/SessionFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/SessionFactory.java @@ -145,8 +145,9 @@ public interface SessionFactory extends EntityManagerFactory, Referenceable, Ser String getJndiName(); /** - * Obtain a {@linkplain SessionBuilder session builder} for creating - * new {@link Session}s with certain customized options. + * Obtain a {@linkplain org.hibernate.SessionBuilder session builder} + * for creating new instances of {@link org.hibernate.Session} with + * certain customized options. * * @return The session builder */ @@ -456,6 +457,26 @@ default boolean containsFetchProfileDefinition(String name) { return getDefinedFilterNames().contains( name ); } + /** + * The name assigned to this {@code SessionFactory}, if any. + * + *

+ * If {@value org.hibernate.cfg.PersistenceSettings#SESSION_FACTORY_NAME_IS_JNDI} + * is enabled, then this name is used to bind this object to JNDI, unless + * {@value org.hibernate.cfg.PersistenceSettings#SESSION_FACTORY_JNDI_NAME} + * is also specified. + * + * @see org.hibernate.cfg.PersistenceSettings#SESSION_FACTORY_NAME + * @see org.hibernate.cfg.PersistenceSettings#SESSION_FACTORY_NAME_IS_JNDI + * @see jakarta.persistence.spi.PersistenceUnitInfo#getPersistenceUnitName + */ + @Override + String getName(); + /** * Get the {@linkplain SessionFactoryOptions options} used to build this factory. * diff --git a/hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java b/hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java index f42706cc6aea..fce6703038fc 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java @@ -4,17 +4,6 @@ */ package org.hibernate.boot.query; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.function.Supplier; - import org.hibernate.LockMode; import org.hibernate.MappingException; import org.hibernate.boot.BootLogging; @@ -43,10 +32,9 @@ import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.persister.collection.CollectionPersister; +import org.hibernate.query.internal.FetchMementoBasicStandard; import org.hibernate.query.internal.FetchMementoEmbeddableStandard; import org.hibernate.query.internal.FetchMementoEntityStandard; -import org.hibernate.spi.NavigablePath; -import org.hibernate.query.internal.FetchMementoBasicStandard; import org.hibernate.query.internal.FetchMementoHbmStandard; import org.hibernate.query.internal.FetchMementoHbmStandard.FetchParentMemento; import org.hibernate.query.internal.NamedResultSetMappingMementoImpl; @@ -58,11 +46,23 @@ import org.hibernate.query.named.FetchMementoBasic; import org.hibernate.query.named.NamedResultSetMappingMemento; import org.hibernate.query.named.ResultMemento; +import org.hibernate.spi.NavigablePath; import org.hibernate.sql.results.graph.Fetchable; import org.hibernate.sql.results.graph.FetchableContainer; import org.hibernate.sql.results.graph.entity.EntityValuedFetchable; import org.hibernate.type.BasicType; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.function.Supplier; + /** * Boot-time descriptor of a result set mapping as defined in an {@code hbm.xml} file * either implicitly or explicitly @@ -372,10 +372,8 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext registrationName ); - final EntityMappingType entityDescriptor = resolutionContext - .getSessionFactory() - .getRuntimeMetamodels() - .getEntityMappingType( entityName ); + final EntityMappingType entityDescriptor = + resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName ); applyFetchJoins( joinDescriptorsAccess, tableAlias, propertyFetchDescriptors ); final NavigablePath entityPath = new NavigablePath( entityName ); @@ -421,10 +419,8 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext @Override public FetchParentMemento resolveParentMemento(ResultSetMappingResolutionContext resolutionContext) { if ( thisAsParentMemento == null ) { - final EntityMappingType entityDescriptor = resolutionContext - .getSessionFactory() - .getRuntimeMetamodels() - .getEntityMappingType( entityName ); + final EntityMappingType entityDescriptor = + resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName ); thisAsParentMemento = new HbmFetchParentMemento( new NavigablePath( entityDescriptor.getEntityName() ), entityDescriptor @@ -916,10 +912,9 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext @Override public FetchParentMemento resolveParentMemento(ResultSetMappingResolutionContext resolutionContext) { if ( thisAsParentMemento == null ) { - final CollectionPersister collectionDescriptor = resolutionContext.getSessionFactory() - .getRuntimeMetamodels() - .getMappingMetamodel() - .getCollectionDescriptor( collectionPath.getFullPath() ); + final CollectionPersister collectionDescriptor = + resolutionContext.getMappingMetamodel() + .getCollectionDescriptor( collectionPath.getFullPath() ); thisAsParentMemento = new HbmFetchParentMemento( collectionPath, collectionDescriptor.getAttributeMapping() ); } @@ -957,10 +952,9 @@ public ResultMementoBasicStandard resolve(ResultSetMappingResolutionContext reso ); if ( hibernateTypeName != null ) { - final BasicType namedType = resolutionContext.getSessionFactory() - .getTypeConfiguration() - .getBasicTypeRegistry() - .getRegisteredType( hibernateTypeName ); + final BasicType namedType = + resolutionContext.getTypeConfiguration().getBasicTypeRegistry() + .getRegisteredType( hibernateTypeName ); if ( namedType == null ) { throw new IllegalArgumentException( "Could not resolve named type : " + hibernateTypeName ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/query/SqlResultSetMappingDescriptor.java b/hibernate-core/src/main/java/org/hibernate/boot/query/SqlResultSetMappingDescriptor.java index 35e0fa75cbe6..d22955481911 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/query/SqlResultSetMappingDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/query/SqlResultSetMappingDescriptor.java @@ -12,10 +12,8 @@ import org.hibernate.LockMode; import org.hibernate.MappingException; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.collections.ArrayHelper; -import org.hibernate.metamodel.RuntimeMetamodels; import org.hibernate.metamodel.mapping.BasicValuedModelPart; import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; import org.hibernate.metamodel.mapping.EntityMappingType; @@ -214,10 +212,9 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext (mapping) -> argumentResultMementos.add( mapping.resolve( resolutionContext ) ) ); - final SessionFactoryImplementor sessionFactory = resolutionContext.getSessionFactory(); - final JavaType targetJtd = sessionFactory.getTypeConfiguration() - .getJavaTypeRegistry() - .getDescriptor( targetJavaType ); + final JavaType targetJtd = + resolutionContext.getTypeConfiguration().getJavaTypeRegistry() + .getDescriptor( targetJavaType ); return new ResultMementoInstantiationStandard( targetJtd, argumentResultMementos ); } @@ -270,8 +267,8 @@ private static Map extractFetchMappings( @Override public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext) { - final RuntimeMetamodels runtimeMetamodels = resolutionContext.getSessionFactory().getRuntimeMetamodels(); - final EntityMappingType entityDescriptor = runtimeMetamodels.getEntityMappingType( entityName ); + final EntityMappingType entityDescriptor = + resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName ); final FetchMementoBasic discriminatorMemento = resolveDiscriminatorMemento( entityDescriptor, @@ -366,8 +363,8 @@ private void addColumn(FieldResult fieldResult) { @Override public ResultMemento asResultMemento(NavigablePath path, ResultSetMappingResolutionContext resolutionContext) { - final RuntimeMetamodels runtimeMetamodels = resolutionContext.getSessionFactory().getRuntimeMetamodels(); - final EntityMappingType entityMapping = runtimeMetamodels.getEntityMappingType( entityName ); + final EntityMappingType entityMapping = + resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName ); final ModelPart subPart = entityMapping.findSubPart( propertyPath, null ); @@ -386,8 +383,8 @@ public ResultMemento asResultMemento(NavigablePath path, ResultSetMappingResolut @Override public FetchMemento resolve(ResultSetMappingResolutionContext resolutionContext) { - final RuntimeMetamodels runtimeMetamodels = resolutionContext.getSessionFactory().getRuntimeMetamodels(); - final EntityMappingType entityMapping = runtimeMetamodels.getEntityMappingType( entityName ); + final EntityMappingType entityMapping = + resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName ); ModelPart subPart = entityMapping.findSubPart( propertyPathParts[0], diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/AggregateWindowEmulationQueryTransformer.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/AggregateWindowEmulationQueryTransformer.java index 46fec75ff6e2..40e337201429 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/AggregateWindowEmulationQueryTransformer.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/AggregateWindowEmulationQueryTransformer.java @@ -10,7 +10,6 @@ import java.util.List; import java.util.Map; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.model.domain.ReturnableType; @@ -92,8 +91,6 @@ public QuerySpec transform( CteContainer cteContainer, QuerySpec querySpec, SqmToSqlAstConverter converter) { - final SessionFactoryImplementor factory = converter.getCreationContext() - .getSessionFactory(); final QuerySpec outerQuerySpec = new QuerySpec( querySpec.isRoot() ); final String identifierVariable = "hhh_"; final NavigablePath navigablePath = new NavigablePath( @@ -400,7 +397,7 @@ protected X replaceExpression(X expression) { columnNames, false, true, - factory + converter.getCreationContext().getSessionFactory() ); outerQuerySpec.getFromClause().addRoot( queryPartTableGroup ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java index 53bbd24d2dce..3c63a4236203 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java @@ -14,6 +14,7 @@ import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.metamodel.model.domain.ReturnableType; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.function.FunctionKind; @@ -150,7 +151,7 @@ public static class Validator implements ArgumentsValidator { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { if ( arguments.size() != 1 ) { throw new FunctionArgumentException( String.format( @@ -166,7 +167,7 @@ public void validate( final SqmExpressible expressible = argument.getExpressible(); final DomainType domainType; if ( expressible != null && ( domainType = expressible.getSqmType() ) != null ) { - final JdbcType jdbcType = getJdbcType( domainType, typeConfiguration ); + final JdbcType jdbcType = getJdbcType( domainType, bindingContext.getTypeConfiguration() ); if ( !isNumeric( jdbcType ) ) { throw new FunctionArgumentException( String.format( @@ -230,7 +231,8 @@ public BasicValuedMapping resolveFunctionReturnType( if ( impliedType != null ) { return impliedType; } - final JdbcMapping jdbcMapping = ( (Expression) arguments.get( 0 ) ).getExpressionType().getSingleJdbcMapping(); + Expression expression = (Expression) arguments.get( 0 ); + final JdbcMapping jdbcMapping = expression.getExpressionType().getSingleJdbcMapping(); if ( jdbcMapping instanceof BasicPluralType ) { return (BasicValuedMapping) jdbcMapping; } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java index b96ac79dd482..4ebb099ca232 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java @@ -9,6 +9,7 @@ import org.hibernate.QueryException; import org.hibernate.metamodel.model.domain.ReturnableType; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; @@ -41,7 +42,7 @@ public ChrLiteralEmulation(TypeConfiguration typeConfiguration) { StandardArgumentsValidators.exactly(1), new ArgumentsValidator() { @Override - public void validate(List> arguments, String functionName, TypeConfiguration typeConfiguration) { + public void validate(List> arguments, String functionName, BindingContext bindingContext) { if ( !( arguments.get( 0 ) instanceof SqmLiteral ) ) { throw new QueryException( String.format( diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/CteGenerateSeriesFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/CteGenerateSeriesFunction.java index bff57bf50abc..4f474e23c6d7 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/CteGenerateSeriesFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/CteGenerateSeriesFunction.java @@ -150,8 +150,9 @@ protected CteStatement createSeriesCte(SqmToSqlAstConverter converter) { } public static CteStatement createSeriesCte(int maxSeriesSize, SqmToSqlAstConverter converter) { - final BasicType longType = converter.getCreationContext().getTypeConfiguration() - .getBasicTypeForJavaType( Long.class ); + final BasicType longType = + converter.getCreationContext().getTypeConfiguration() + .getBasicTypeForJavaType( Long.class ); final Expression one = new UnparsedNumericLiteral<>( "1", NumericTypeCategory.LONG, longType ); final List cteColumns = List.of( new CteColumn( "i", longType ) ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java index 67a249d53625..fd5a5de58f6b 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java @@ -7,6 +7,7 @@ import java.util.List; import org.hibernate.metamodel.model.domain.ReturnableType; +import org.hibernate.query.BindingContext; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.function.FunctionKind; import org.hibernate.query.sqm.function.SelfRenderingSqmFunction; @@ -16,7 +17,6 @@ import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.query.sqm.tree.predicate.SqmPredicate; import org.hibernate.query.sqm.tree.select.SqmOrderByClause; -import org.hibernate.type.spi.TypeConfiguration; /** * A function that dynamically dispatches to other functions, @@ -61,10 +61,7 @@ public SelfRenderingSqmFunction generateSqmExpression( List> arguments, ReturnableType impliedResultType, QueryEngine queryEngine) { - final SqmFunctionDescriptor functionDescriptor = validateGetFunction( - arguments, - queryEngine.getTypeConfiguration() - ); + final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine ); return functionDescriptor.generateSqmExpression( arguments, impliedResultType, queryEngine ); } @@ -74,10 +71,7 @@ public SelfRenderingSqmFunction generateAggregateSqmExpression( SqmPredicate filter, ReturnableType impliedResultType, QueryEngine queryEngine) { - final SqmFunctionDescriptor functionDescriptor = validateGetFunction( - arguments, - queryEngine.getTypeConfiguration() - ); + final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine ); return functionDescriptor.generateAggregateSqmExpression( arguments, filter, @@ -93,10 +87,7 @@ public SelfRenderingSqmFunction generateOrderedSetAggregateSqmExpression( SqmOrderByClause withinGroupClause, ReturnableType impliedResultType, QueryEngine queryEngine) { - final SqmFunctionDescriptor functionDescriptor = validateGetFunction( - arguments, - queryEngine.getTypeConfiguration() - ); + final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine ); return functionDescriptor.generateOrderedSetAggregateSqmExpression( arguments, filter, @@ -114,10 +105,7 @@ public SelfRenderingSqmFunction generateWindowSqmExpression( Boolean fromFirst, ReturnableType impliedResultType, QueryEngine queryEngine) { - final SqmFunctionDescriptor functionDescriptor = validateGetFunction( - arguments, - queryEngine.getTypeConfiguration() - ); + final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine ); return functionDescriptor.generateWindowSqmExpression( arguments, filter, @@ -137,13 +125,13 @@ public ArgumentsValidator getArgumentsValidator() { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { - validateGetFunction( arguments, typeConfiguration ); + BindingContext bindingContext) { + validateGetFunction( arguments, bindingContext ); } private SqmFunctionDescriptor validateGetFunction( List> arguments, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { RuntimeException exception = null; for ( String overload : functionNames ) { final SqmFunctionDescriptor functionDescriptor = functionRegistry.findFunctionDescriptor( overload ); @@ -151,7 +139,7 @@ private SqmFunctionDescriptor validateGetFunction( throw new IllegalArgumentException( "No function registered under the name '" + overload + "'" ); } try { - functionDescriptor.getArgumentsValidator().validate( arguments, overload, typeConfiguration ); + functionDescriptor.getArgumentsValidator().validate( arguments, overload, bindingContext ); return functionDescriptor; } catch (RuntimeException ex) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/FormatFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/FormatFunction.java index aab2081c658b..e200e4cc3e2b 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/FormatFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/FormatFunction.java @@ -221,9 +221,7 @@ public Expression convertToSqlAst(SqmToSqlAstConverter walker) { final FunctionRenderer substringFunction = getFunction( walker, "substring", 3 ); final BasicType stringType = typeConfiguration.getBasicTypeRegistry() .resolve( StandardBasicTypes.STRING ); - final Dialect dialect = - walker.getCreationContext().getSessionFactory().getJdbcServices() - .getDialect(); + final Dialect dialect = walker.getCreationContext().getDialect(); Expression formatExpression = null; final StringBuilder sb = new StringBuilder(); final StringBuilderSqlAppender sqlAppender = new StringBuilderSqlAppender( sb ); @@ -425,13 +423,12 @@ public Expression convertToSqlAst(SqmToSqlAstConverter walker) { private FunctionRenderer getFunction(SqmToSqlAstConverter walker, String name) { return (FunctionRenderer) - walker.getCreationContext().getSessionFactory().getQueryEngine() - .getSqmFunctionRegistry().findFunctionDescriptor( name ); + walker.getCreationContext().getSqmFunctionRegistry().findFunctionDescriptor( name ); } private FunctionRenderer getFunction(SqmToSqlAstConverter walker, String name, int argumentCount) { final SqmFunctionDescriptor functionDescriptor = - walker.getCreationContext().getSessionFactory().getQueryEngine().getSqmFunctionRegistry() + walker.getCreationContext().getSqmFunctionRegistry() .findFunctionDescriptor( name ); if ( functionDescriptor instanceof MultipatternSqmFunctionDescriptor multipatternSqmFunctionDescriptor ) { return (FunctionRenderer) multipatternSqmFunctionDescriptor.getFunction( argumentCount ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java index 5cf39b3d8e7d..5163b7563beb 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java @@ -6,13 +6,13 @@ import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.model.domain.DomainType; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.type.descriptor.jdbc.JdbcType; -import org.hibernate.type.spi.TypeConfiguration; import java.util.List; import java.util.Locale; @@ -32,8 +32,8 @@ public GenerateSeriesArgumentValidator() { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { - delegate.validate( arguments, functionName, typeConfiguration ); + BindingContext bindingContext) { + delegate.validate( arguments, functionName, bindingContext ); final SqmTypedNode start = arguments.get( 0 ); final SqmTypedNode stop = arguments.get( 1 ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/InverseDistributionFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/InverseDistributionFunction.java index edffe43cf4c6..764d5e52dd3b 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/InverseDistributionFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/InverseDistributionFunction.java @@ -189,7 +189,7 @@ protected MappingModelExpressible getMappingModelExpressible( return basicValuedMapping; } try { - return walker.getCreationContext().getSessionFactory().getMappingMetamodel() + return walker.getCreationContext().getMappingMetamodel() .resolveMappingExpressible( getNodeType(), walker.getFromClauseAccess()::getTableGroup ); } catch (Exception e) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/NumberSeriesGenerateSeriesFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/NumberSeriesGenerateSeriesFunction.java index d5070882852a..0209a93dd290 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/NumberSeriesGenerateSeriesFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/NumberSeriesGenerateSeriesFunction.java @@ -5,7 +5,6 @@ package org.hibernate.dialect.function; import org.checkerframework.checker.nullness.qual.Nullable; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.internal.util.NullnessHelper; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.metamodel.mapping.CollectionPart; @@ -28,6 +27,7 @@ import org.hibernate.sql.Template; import org.hibernate.sql.ast.SqlAstTranslator; import org.hibernate.sql.ast.spi.SqlAppender; +import org.hibernate.sql.ast.spi.SqlAstCreationContext; import org.hibernate.sql.ast.tree.SqlAstNode; import org.hibernate.sql.ast.tree.cte.CteContainer; import org.hibernate.sql.ast.tree.expression.BinaryArithmeticExpression; @@ -107,8 +107,8 @@ protected static boolean needsVariable(Expression expression) { public static Expression add(Expression left, Expression right, SqmToSqlAstConverter converter) { if ( right instanceof org.hibernate.sql.ast.tree.expression.Duration duration ) { final BasicType nodeType = (BasicType) left.getExpressionType().getSingleJdbcMapping(); - final FunctionRenderer timestampadd = (FunctionRenderer) converter.getCreationContext().getSessionFactory() - .getQueryEngine().getSqmFunctionRegistry().findFunctionDescriptor( "timestampadd" ); + final FunctionRenderer timestampadd = (FunctionRenderer) converter.getCreationContext() + .getSqmFunctionRegistry().findFunctionDescriptor( "timestampadd" ); return new SelfRenderingFunctionSqlAstExpression( "timestampadd", timestampadd, @@ -155,10 +155,11 @@ public static Expression multiply(Expression left, Expression multiplier) { static Expression castToTimestamp(SqlAstNode node, SqmToSqlAstConverter converter) { final BasicType nodeType = (BasicType) ((Expression) node).getExpressionType().getSingleJdbcMapping(); - final FunctionRenderer cast = (FunctionRenderer) converter.getCreationContext().getSessionFactory().getQueryEngine() - .getSqmFunctionRegistry().findFunctionDescriptor( "cast" ); - final BasicType timestampType = converter.getCreationContext().getTypeConfiguration() - .getBasicTypeForJavaType( Timestamp.class ); + final FunctionRenderer cast = (FunctionRenderer) + converter.getCreationContext().getSqmFunctionRegistry().findFunctionDescriptor( "cast" ); + final BasicType timestampType = + converter.getCreationContext().getTypeConfiguration() + .getBasicTypeForJavaType( Timestamp.class ); return new SelfRenderingFunctionSqlAstExpression( "cast", cast, @@ -211,8 +212,7 @@ public QuerySpec transform(CteContainer cteContainer, QuerySpec querySpec, SqmTo else { predicateContainer = querySpec; } - final BasicType integerType = converter.getCreationContext() - .getSessionFactory() + final BasicType integerType = converter.getSqmCreationContext() .getNodeBuilder() .getIntegerType(); final Expression oneBasedOrdinal = new ColumnReference( @@ -247,8 +247,7 @@ public QuerySpec transform(CteContainer cteContainer, QuerySpec querySpec, SqmTo } else { // When start < stop, step must be positive and value is only valid if it's less than or equal to stop - final BasicType booleanType = converter.getCreationContext() - .getSessionFactory() + final BasicType booleanType = converter.getSqmCreationContext() .getNodeBuilder() .getBooleanType(); final Predicate positiveProgress = new Junction( @@ -438,8 +437,10 @@ protected SelectableMapping[] resolveIterationVariableBasedFunctionReturnType( } private static String timestampadd(String startExpression, String stepExpression, JdbcMapping type, org.hibernate.sql.ast.tree.expression.Duration duration, SqmToSqlAstConverter converter) { - final FunctionRenderer renderer = (FunctionRenderer) converter.getCreationContext().getSessionFactory() - .getQueryEngine().getSqmFunctionRegistry().findFunctionDescriptor( "timestampadd" ); + final SqlAstCreationContext creationContext = converter.getCreationContext(); + + final FunctionRenderer renderer = (FunctionRenderer) creationContext.getSqmFunctionRegistry() + .findFunctionDescriptor( "timestampadd" ); final QuerySpec fakeQuery = new QuerySpec( true ); fakeQuery.getSelectClause().addSqlSelection( new SqlSelectionImpl( new SelfRenderingFunctionSqlAstExpression( @@ -454,9 +455,9 @@ private static String timestampadd(String startExpression, String stepExpression type ) ) ); - final SqlAstTranslator translator = converter.getCreationContext() - .getSessionFactory().getJdbcServices().getDialect().getSqlAstTranslatorFactory() - .buildSelectTranslator( converter.getCreationContext().getSessionFactory(), new SelectStatement( fakeQuery ) ); + final SqlAstTranslator translator = + creationContext.getDialect().getSqlAstTranslatorFactory() + .buildSelectTranslator( creationContext.getSessionFactory(), new SelectStatement( fakeQuery ) ); final JdbcOperationQuerySelect operation = translator.translate( null, QueryOptions.NONE ); final String sqlString = operation.getSqlString(); assert sqlString.startsWith( "select " ); @@ -483,11 +484,11 @@ private String getStepExpression(@Nullable Expression explicitStep, String table private String getExpression(Expression expression, String tableIdentifierVariable, String syntheticColumnName, SqmToSqlAstConverter walker) { if ( expression instanceof Literal literal ) { - final SessionFactoryImplementor sessionFactory = walker.getCreationContext().getSessionFactory(); //noinspection unchecked + final SqlAstCreationContext creationContext = walker.getCreationContext(); return literal.getJdbcMapping().getJdbcLiteralFormatter() - .toJdbcLiteral( literal.getLiteralValue(), sessionFactory.getJdbcServices().getDialect(), - sessionFactory.getWrapperOptions() ); + .toJdbcLiteral( literal.getLiteralValue(), creationContext.getDialect(), + creationContext.getWrapperOptions() ); } else if ( expression instanceof ColumnReference columnReference ) { return columnReference.getExpressionText(); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java index 5ce4fbd51f2e..386fafd88a00 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java @@ -8,6 +8,7 @@ import java.util.List; import org.hibernate.metamodel.model.domain.ReturnableType; +import org.hibernate.query.BindingContext; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.common.TemporalUnit; @@ -215,12 +216,12 @@ protected static class TruncArgumentsValidator implements ArgumentsValidator { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { if ( arguments.size() == 2 && arguments.get( 1 ) instanceof SqmExtractUnit ) { - DATETIME_VALIDATOR.validate( arguments, functionName, typeConfiguration ); + DATETIME_VALIDATOR.validate( arguments, functionName, bindingContext ); } else { - NUMERIC_VALIDATOR.validate( arguments, functionName, typeConfiguration ); + NUMERIC_VALIDATOR.validate( arguments, functionName, bindingContext ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/AbstractArrayFillFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/AbstractArrayFillFunction.java index 9621b32e0cbf..46b20a4789eb 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/AbstractArrayFillFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/AbstractArrayFillFunction.java @@ -55,7 +55,7 @@ private ArrayFillArgumentsValidator() { : null; } else { - return converter.getCreationContext().getSessionFactory().getTypeConfiguration().getBasicTypeRegistry() + return converter.getCreationContext().getTypeConfiguration().getBasicTypeRegistry() .getRegisteredType( Integer.class ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/AbstractArrayPositionFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/AbstractArrayPositionFunction.java index 2313b4aba2c8..f26abb6af629 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/AbstractArrayPositionFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/AbstractArrayPositionFunction.java @@ -42,7 +42,6 @@ public AbstractArrayPositionFunction(TypeConfiguration typeConfiguration) { public @Nullable MappingModelExpressible resolveFunctionArgumentType(List> arguments, int argumentIndex, SqmToSqlAstConverter converter) { if ( argumentIndex == 2 ) { return converter.getCreationContext() - .getSessionFactory() .getTypeConfiguration() .standardBasicTypeForJavaType( Integer.class ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentTypeResolver.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentTypeResolver.java index 8ce0d89e9cf1..d9622056cfb6 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentTypeResolver.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentTypeResolver.java @@ -43,7 +43,7 @@ public ArrayAndElementArgumentTypeResolver(int arrayIndex, int... elementIndexes if ( expressible != null ) { return DdlTypeHelper.resolveArrayType( (DomainType) expressible.getSingleJdbcMapping(), - converter.getCreationContext().getSessionFactory().getTypeConfiguration() + converter.getCreationContext().getTypeConfiguration() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java index 98c2f76e5950..5dd439b21249 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java @@ -6,12 +6,12 @@ import java.util.List; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.type.BasicType; -import org.hibernate.type.spi.TypeConfiguration; /** * A {@link ArgumentsValidator} that validates the array type is compatible with the element type. @@ -31,8 +31,8 @@ public ArrayAndElementArgumentValidator(int arrayIndex, int... elementIndexes) { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { - final BasicType expectedElementType = getElementType( arguments, functionName, typeConfiguration ); + BindingContext bindingContext) { + final BasicType expectedElementType = getElementType( arguments, functionName, bindingContext ); for ( int elementIndex : elementIndexes ) { if ( elementIndex < arguments.size() ) { final SqmTypedNode elementArgument = arguments.get( elementIndex ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java index 7d978b2bed8f..34b8965f631d 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java @@ -6,13 +6,13 @@ import java.util.List; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.type.BasicPluralType; import org.hibernate.type.BasicType; -import org.hibernate.type.spi.TypeConfiguration; /** * A {@link ArgumentsValidator} that validates the array type is compatible with the element type. @@ -31,22 +31,22 @@ public ArrayArgumentValidator(int arrayIndex) { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { - getElementType( arguments, functionName, typeConfiguration ); + BindingContext bindingContext) { + getElementType( arguments, functionName, bindingContext ); } protected BasicType getElementType( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { - return getElementType( arrayIndex, arguments, functionName, typeConfiguration ); + BindingContext bindingContext) { + return getElementType( arrayIndex, arguments, functionName, bindingContext ); } protected BasicPluralType getPluralType( int arrayIndex, List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { final SqmTypedNode arrayArgument = arguments.get( arrayIndex ); final SqmExpressible expressible = arrayArgument.getExpressible(); if ( expressible == null ) { @@ -75,7 +75,7 @@ protected BasicType getElementType( int arrayIndex, List> arguments, String functionName, - TypeConfiguration typeConfiguration) { - return getPluralType( arrayIndex, arguments, functionName, typeConfiguration ).getElementType(); + BindingContext bindingContext) { + return getPluralType( arrayIndex, arguments, functionName, bindingContext ).getElementType(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java index 4185315608c9..95bc8be3b91c 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java @@ -6,12 +6,11 @@ import java.util.List; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.JdbcMappingContainer; import org.hibernate.metamodel.model.domain.ReturnableType; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; -import org.hibernate.query.sqm.internal.TypecheckUtil; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers; @@ -21,7 +20,8 @@ import org.hibernate.sql.ast.tree.SqlAstNode; import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.type.BottomType; -import org.hibernate.type.spi.TypeConfiguration; + +import static org.hibernate.query.sqm.internal.TypecheckUtil.areTypesComparable; public class ArrayConstructorFunction extends AbstractSqmSelfRenderingFunctionDescriptor { @@ -75,8 +75,7 @@ private ArrayConstructorArgumentsValidator() { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { - final SessionFactoryImplementor sessionFactory = typeConfiguration.getSessionFactory(); + BindingContext bindingContext) { final int size = arguments.size(); SqmExpressible firstType = null; for ( int i = 0; i < size; i++ ) { @@ -84,7 +83,7 @@ public void validate( if ( firstType == null ) { firstType = argument; } - else if ( !TypecheckUtil.areTypesComparable( firstType, argument, sessionFactory ) ) { + else if ( !areTypesComparable( firstType, argument, bindingContext ) ) { throw new FunctionArgumentException( String.format( "All array arguments must have a compatible type compatible to the first argument type [%s], but argument %d has type '%s'", diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentTypeResolver.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentTypeResolver.java index feb0fb02b685..56a6975158c2 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentTypeResolver.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentTypeResolver.java @@ -36,7 +36,7 @@ public class ArrayContainsArgumentTypeResolver extends AbstractFunctionArgumentT else { return DdlTypeHelper.resolveArrayType( (DomainType) expressible.getSingleJdbcMapping(), - converter.getCreationContext().getSessionFactory().getTypeConfiguration() + converter.getCreationContext().getTypeConfiguration() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java index 702448fd8172..0b98802d410b 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java @@ -6,12 +6,12 @@ import java.util.List; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.type.BasicPluralType; -import org.hibernate.type.spi.TypeConfiguration; /** * A {@link ArgumentsValidator} that validates the arguments for the {@code array_contains} function. @@ -28,9 +28,9 @@ protected ArrayContainsArgumentValidator() { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { final BasicPluralType haystackType = - getPluralType( 0, arguments, functionName, typeConfiguration ); + getPluralType( 0, arguments, functionName, bindingContext ); final SqmExpressible expressible = arguments.get( 1 ).getExpressible(); final SqmExpressible needleType = expressible == null ? null : expressible.getSqmType(); if ( haystackType!= null && needleType != null diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java index d7e510fd8ebb..2592f955c5b3 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java @@ -6,11 +6,11 @@ import java.util.List; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.type.BasicPluralType; -import org.hibernate.type.spi.TypeConfiguration; /** * A {@link ArgumentsValidator} that validates the arguments for the {@code array_includes} function. @@ -27,11 +27,11 @@ protected ArrayIncludesArgumentValidator() { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { final BasicPluralType haystackType = - getPluralType( 0, arguments, functionName, typeConfiguration ); + getPluralType( 0, arguments, functionName, bindingContext ); final BasicPluralType needleType = - getPluralType( 1, arguments, functionName, typeConfiguration ); + getPluralType( 1, arguments, functionName, bindingContext ); if ( haystackType != null && needleType != null && !haystackType.equals( needleType ) && !haystackType.getElementType().equals( needleType ) ) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java index b402b4e02cfb..f723d334190d 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java @@ -8,12 +8,12 @@ import java.util.Objects; import org.hibernate.metamodel.model.domain.DomainType; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.type.BasicPluralType; -import org.hibernate.type.spi.TypeConfiguration; /** * A {@link ArgumentsValidator} that validates all arguments are of the same array type. @@ -26,7 +26,7 @@ public class ArraysOfSameTypeArgumentValidator implements ArgumentsValidator { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { BasicPluralType arrayType = null; for ( int i = 0; i < arguments.size(); i++ ) { final SqmExpressible expressible = arguments.get( i ).getExpressible(); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/H2UnnestFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/H2UnnestFunction.java index 60d7c0d1c88f..f83fd2148e92 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/H2UnnestFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/H2UnnestFunction.java @@ -109,8 +109,7 @@ public TableGroup convertToSqlAst( tg -> tg.findTableGroupJoin( functionTableGroup ) == null ? null : tg ); final TableGroupJoin join = parentTableGroup.findTableGroupJoin( functionTableGroup ); - final BasicType integerType = walker.getCreationContext() - .getSessionFactory() + final BasicType integerType = walker.getSqmCreationContext() .getNodeBuilder() .getIntegerType(); final Expression lhs = new SelfRenderingExpression() { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/json/H2JsonTableFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/json/H2JsonTableFunction.java index b26fa504ba6e..745b6632e625 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/json/H2JsonTableFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/json/H2JsonTableFunction.java @@ -60,10 +60,11 @@ import org.hibernate.type.spi.TypeConfiguration; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Set; +import static java.util.Collections.emptyList; + /** * H2 json_table function. @@ -161,8 +162,7 @@ public QuerySpec transform(CteContainer cteContainer, QuerySpec querySpec, SqmTo else { predicateContainer = querySpec; } - final BasicType integerType = converter.getCreationContext() - .getSessionFactory() + final BasicType integerType = converter.getSqmCreationContext() .getNodeBuilder() .getIntegerType(); final Expression jsonDocument; @@ -221,20 +221,19 @@ public QuerySpec transform(CteContainer cteContainer, QuerySpec querySpec, SqmTo maximumArraySize, lastArrayIndex ), - Collections.emptyList(), + emptyList(), null, null ), tableIdentifierVariable + "_synthetic_", - Collections.emptyList(), + emptyList(), Set.of( "" ), false, false, true, converter.getCreationContext().getSessionFactory() ); - final BasicType integerType = converter.getCreationContext() - .getSessionFactory() + final BasicType integerType = converter.getSqmCreationContext() .getNodeBuilder() .getIntegerType(); @@ -751,8 +750,8 @@ private String castValueExpression(String baseReadExpression, CastTarget castTar //noinspection unchecked final String sqlLiteral = defaultExpression.getJdbcMapping().getJdbcLiteralFormatter().toJdbcLiteral( defaultExpression.getLiteralValue(), - converter.getCreationContext().getSessionFactory().getJdbcServices().getDialect(), - converter.getCreationContext().getSessionFactory().getWrapperOptions() + converter.getCreationContext().getDialect(), + converter.getCreationContext().getWrapperOptions() ); sb.append( sqlLiteral ); sb.append( ')' ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java index 421212d601fe..51d0fff8e446 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java @@ -9,6 +9,7 @@ import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.JdbcMappingContainer; import org.hibernate.metamodel.model.domain.DomainType; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; @@ -19,7 +20,6 @@ import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.JsonNullBehavior; import org.hibernate.type.descriptor.java.JavaType; -import org.hibernate.type.spi.TypeConfiguration; import static org.hibernate.query.sqm.produce.function.ArgumentTypesValidator.checkArgumentType; import static org.hibernate.query.sqm.produce.function.ArgumentTypesValidator.isUnknownExpressionType; @@ -31,7 +31,7 @@ public class JsonObjectArgumentsValidator implements ArgumentsValidator { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { if ( !arguments.isEmpty() ) { final SqmTypedNode lastArgument = arguments.get( arguments.size() - 1 ); final int argumentsCount; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/json/OracleJsonTableFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/json/OracleJsonTableFunction.java index 97f0ee785d76..b87b4052ea2c 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/json/OracleJsonTableFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/json/OracleJsonTableFunction.java @@ -5,7 +5,6 @@ package org.hibernate.dialect.function.json; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.metamodel.mapping.SelectablePath; @@ -118,9 +117,8 @@ protected void addSelectableMapping(List selectableMappings, if ( isEncodedBoolean( type ) ) { //noinspection unchecked final JdbcLiteralFormatter jdbcLiteralFormatter = type.getJdbcLiteralFormatter(); - final SessionFactoryImplementor sessionFactory = converter.getCreationContext().getSessionFactory(); - final Dialect dialect = sessionFactory.getJdbcServices().getDialect(); - final WrapperOptions wrapperOptions = sessionFactory.getWrapperOptions(); + final Dialect dialect = converter.getCreationContext().getDialect(); + final WrapperOptions wrapperOptions = converter.getCreationContext().getWrapperOptions(); final Object trueValue = type.convertToRelationalValue( true ); final Object falseValue = type.convertToRelationalValue( false ); final String trueFragment = jdbcLiteralFormatter.toJdbcLiteral( trueValue, dialect, wrapperOptions ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/DB2XmlTableFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/DB2XmlTableFunction.java index 0f9ed0d3304b..45e4e07fb476 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/DB2XmlTableFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/DB2XmlTableFunction.java @@ -5,7 +5,6 @@ package org.hibernate.dialect.function.xml; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.metamodel.mapping.SelectablePath; @@ -83,9 +82,8 @@ protected void addSelectableMapping(List selectableMappings, if ( isBoolean( type ) ) { //noinspection unchecked final JdbcLiteralFormatter jdbcLiteralFormatter = type.getJdbcLiteralFormatter(); - final SessionFactoryImplementor sessionFactory = converter.getCreationContext().getSessionFactory(); - final Dialect dialect = sessionFactory.getJdbcServices().getDialect(); - final WrapperOptions wrapperOptions = sessionFactory.getWrapperOptions(); + final Dialect dialect = converter.getCreationContext().getDialect(); + final WrapperOptions wrapperOptions = converter.getCreationContext().getWrapperOptions(); final Object trueValue = type.convertToRelationalValue( true ); final Object falseValue = type.convertToRelationalValue( false ); final String trueFragment = jdbcLiteralFormatter.toJdbcLiteral( trueValue, dialect, wrapperOptions ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/HANAXmlTableFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/HANAXmlTableFunction.java index efa77c607753..888019869c6a 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/HANAXmlTableFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/HANAXmlTableFunction.java @@ -437,9 +437,8 @@ protected void addSelectableMapping(List selectableMappings, if ( isBoolean( type ) ) { //noinspection unchecked final JdbcLiteralFormatter jdbcLiteralFormatter = type.getJdbcLiteralFormatter(); - final SessionFactoryImplementor sessionFactory = converter.getCreationContext().getSessionFactory(); - final Dialect dialect = sessionFactory.getJdbcServices().getDialect(); - final WrapperOptions wrapperOptions = sessionFactory.getWrapperOptions(); + final Dialect dialect = converter.getCreationContext().getDialect(); + final WrapperOptions wrapperOptions = converter.getCreationContext().getWrapperOptions(); final Object trueValue = type.convertToRelationalValue( true ); final Object falseValue = type.convertToRelationalValue( false ); final String trueFragment = jdbcLiteralFormatter.toJdbcLiteral( trueValue, dialect, wrapperOptions ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/OracleXmlTableFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/OracleXmlTableFunction.java index c39997a1497b..fb701afd6def 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/OracleXmlTableFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/OracleXmlTableFunction.java @@ -5,7 +5,6 @@ package org.hibernate.dialect.function.xml; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.metamodel.mapping.SelectablePath; @@ -48,9 +47,8 @@ protected void addSelectableMapping(List selectableMappings, if ( isEncodedBoolean( type ) ) { //noinspection unchecked final JdbcLiteralFormatter jdbcLiteralFormatter = type.getJdbcLiteralFormatter(); - final SessionFactoryImplementor sessionFactory = converter.getCreationContext().getSessionFactory(); - final Dialect dialect = sessionFactory.getJdbcServices().getDialect(); - final WrapperOptions wrapperOptions = sessionFactory.getWrapperOptions(); + final Dialect dialect = converter.getCreationContext().getDialect(); + final WrapperOptions wrapperOptions = converter.getCreationContext().getWrapperOptions(); final Object trueValue = type.convertToRelationalValue( true ); final Object falseValue = type.convertToRelationalValue( false ); final String trueFragment = jdbcLiteralFormatter.toJdbcLiteral( trueValue, dialect, wrapperOptions ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/SybaseASEXmlTableFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/SybaseASEXmlTableFunction.java index a59a4b9020e1..40b636790641 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/SybaseASEXmlTableFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/SybaseASEXmlTableFunction.java @@ -6,7 +6,6 @@ import org.hibernate.QueryException; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.metamodel.mapping.SelectablePath; @@ -126,8 +125,8 @@ protected void addSelectableMappings(List selectableMappings, if ( arguments.xmlDocument() instanceof Literal documentLiteral ) { documentFragment = documentLiteral.getJdbcMapping().getJdbcLiteralFormatter().toJdbcLiteral( documentLiteral.getLiteralValue(), - converter.getCreationContext().getSessionFactory().getJdbcServices().getDialect(), - converter.getCreationContext().getSessionFactory().getWrapperOptions() + converter.getCreationContext().getDialect(), + converter.getCreationContext().getWrapperOptions() ); } else if ( arguments.xmlDocument() instanceof ColumnReference columnReference ) { @@ -169,9 +168,8 @@ protected void addSelectableMapping(List selectableMappings, if ( isBoolean( type ) ) { //noinspection unchecked final JdbcLiteralFormatter jdbcLiteralFormatter = type.getJdbcLiteralFormatter(); - final SessionFactoryImplementor sessionFactory = converter.getCreationContext().getSessionFactory(); - final Dialect dialect = sessionFactory.getJdbcServices().getDialect(); - final WrapperOptions wrapperOptions = sessionFactory.getWrapperOptions(); + final Dialect dialect = converter.getCreationContext().getDialect(); + final WrapperOptions wrapperOptions = converter.getCreationContext().getWrapperOptions(); final Object trueValue = type.convertToRelationalValue( true ); final Object falseValue = type.convertToRelationalValue( false ); final String trueFragment = jdbcLiteralFormatter.toJdbcLiteral( trueValue, dialect, wrapperOptions ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java index f4fb281ffbe7..a4fbc773e09e 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java @@ -9,6 +9,7 @@ import org.hibernate.dialect.XmlHelper; import org.hibernate.metamodel.model.domain.ReturnableType; +import org.hibernate.query.BindingContext; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.function.FunctionKind; @@ -52,7 +53,7 @@ public XmlElementFunction(TypeConfiguration typeConfiguration) { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { //noinspection unchecked final String elementName = ( (SqmLiteral) arguments.get( 0 ) ).getLiteralValue(); if ( !XmlHelper.isValidXmlName( elementName ) ) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java index 786784b3cfc1..29cf6fd4073c 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java @@ -8,6 +8,7 @@ import org.hibernate.dialect.XmlHelper; import org.hibernate.metamodel.model.domain.ReturnableType; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.function.FunctionKind; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; @@ -39,7 +40,7 @@ public XmlForestFunction(TypeConfiguration typeConfiguration) { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { for ( int i = 0; i < arguments.size(); i++ ) { SqmTypedNode argument = arguments.get( i ); if ( !( argument instanceof SqmNamedExpression namedExpression ) ) { diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/LoadQueryInfluencers.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/LoadQueryInfluencers.java index 39398b61ba08..1506587ee3e5 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/LoadQueryInfluencers.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/LoadQueryInfluencers.java @@ -5,7 +5,6 @@ package org.hibernate.engine.spi; import java.io.Serializable; -import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -27,7 +26,9 @@ import org.checkerframework.checker.nullness.qual.Nullable; +import static java.util.Collections.emptyMap; import static java.util.Collections.emptySet; +import static java.util.Collections.unmodifiableSet; import static org.hibernate.engine.FetchStyle.SUBSELECT; /** @@ -73,8 +74,8 @@ public LoadQueryInfluencers(SessionFactoryImplementor sessionFactory, SessionCre batchSize = options.getDefaultBatchFetchSize(); subselectFetchEnabled = options.isSubselectFetchEnabled(); effectiveEntityGraph = new EffectiveEntityGraph(); - for (FilterDefinition filterDefinition : sessionFactory.getAutoEnabledFilters()) { - FilterImpl filter = new FilterImpl( filterDefinition ); + for ( FilterDefinition filterDefinition : sessionFactory.getAutoEnabledFilters() ) { + final FilterImpl filter = new FilterImpl( filterDefinition ); if ( enabledFilters == null ) { enabledFilters = new TreeMap<>(); } @@ -158,7 +159,7 @@ public boolean hasEnabledFilters() { public Map getEnabledFilters() { final TreeMap enabledFilters = this.enabledFilters; if ( enabledFilters == null ) { - return Collections.emptyMap(); + return emptyMap(); } else { // First, validate all the enabled filters... @@ -175,27 +176,17 @@ public Map getEnabledFilters() { * @return an unmodifiable Set of enabled filter names. */ public Set getEnabledFilterNames() { - if ( enabledFilters == null ) { - return emptySet(); - } - else { - return Collections.unmodifiableSet( enabledFilters.keySet() ); - } + return enabledFilters == null ? emptySet() : unmodifiableSet( enabledFilters.keySet() ); } public @Nullable Filter getEnabledFilter(String filterName) { - if ( enabledFilters == null ) { - return null; - } - else { - return enabledFilters.get( filterName ); - } + return enabledFilters == null ? null : enabledFilters.get( filterName ); } public Filter enableFilter(String filterName) { - FilterImpl filter = new FilterImpl( sessionFactory.getFilterDefinition( filterName ) ); + final FilterImpl filter = new FilterImpl( sessionFactory.getFilterDefinition( filterName ) ); if ( enabledFilters == null ) { - this.enabledFilters = new TreeMap<>(); + enabledFilters = new TreeMap<>(); } enabledFilters.put( filterName, filter ); return filter; @@ -269,7 +260,8 @@ public void disableFetchProfile(String name) throws UnknownProfileException { } @Internal - public @Nullable HashSet adjustFetchProfiles(@Nullable Set disabledFetchProfiles, @Nullable Set enabledFetchProfiles) { + public @Nullable HashSet adjustFetchProfiles( + @Nullable Set disabledFetchProfiles, @Nullable Set enabledFetchProfiles) { final HashSet currentEnabledFetchProfileNames = this.enabledFetchProfileNames; final HashSet oldFetchProfiles; if ( currentEnabledFetchProfileNames == null || currentEnabledFetchProfileNames.isEmpty() ) { @@ -354,7 +346,8 @@ public boolean effectiveSubselectFetchEnabled(CollectionPersister persister) { private boolean isSubselectFetchEnabledInProfile(CollectionPersister persister) { if ( hasEnabledFetchProfiles() ) { for ( String profile : getEnabledFetchProfileNames() ) { - final FetchProfile fetchProfile = persister.getFactory().getFetchProfile( profile ) ; + final FetchProfile fetchProfile = + persister.getFactory().getSqlTranslationEngine().getFetchProfile( profile ) ; if ( fetchProfile != null ) { final Fetch fetch = fetchProfile.getFetchByRole( persister.getRole() ); if ( fetch != null && fetch.getMethod() == SUBSELECT) { @@ -375,7 +368,7 @@ public boolean hasSubselectLoadableCollections(EntityPersister persister) { private boolean hasSubselectLoadableCollectionsEnabledInProfile(EntityPersister persister) { if ( hasEnabledFetchProfiles() ) { for ( String profile : getEnabledFetchProfileNames() ) { - if ( persister.getFactory().getFetchProfile( profile ) + if ( persister.getFactory().getSqlTranslationEngine().getFetchProfile( profile ) .hasSubselectLoadableCollectionsEnabled( persister ) ) { return true; } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryDelegatingImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryDelegatingImpl.java index 22f6f1177417..57ab3e3b52e8 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryDelegatingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryDelegatingImpl.java @@ -47,6 +47,7 @@ import org.hibernate.proxy.EntityNotFoundDelegate; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.spi.QueryEngine; +import org.hibernate.query.sql.spi.SqlTranslationEngine; import org.hibernate.relational.SchemaManager; import org.hibernate.resource.beans.spi.ManagedBeanRegistry; import org.hibernate.service.spi.ServiceRegistryImplementor; @@ -277,11 +278,6 @@ public ServiceRegistryImplementor getServiceRegistry() { return delegate.getServiceRegistry(); } - @Override - public Integer getMaximumFetchDepth() { - return delegate.getMaximumFetchDepth(); - } - @Override public void addObserver(SessionFactoryObserver observer) { delegate.addObserver( observer ); @@ -342,6 +338,11 @@ public QueryEngine getQueryEngine() { return delegate.getQueryEngine(); } + @Override + public SqlTranslationEngine getSqlTranslationEngine() { + return delegate.getSqlTranslationEngine(); + } + @Override public Reference getReference() throws NamingException { return delegate.getReference(); @@ -392,11 +393,6 @@ public List> findEntityGraphsByType(Class entityCl return delegate.findEntityGraphsByType(entityClass); } - @Override - public Class classForName(String className) { - return delegate.classForName( className ); - } - @Override public EventListenerGroups getEventListenerGroups() { return delegate.getEventListenerGroups(); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryImplementor.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryImplementor.java index 4188265a3af8..0149e88982f8 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryImplementor.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryImplementor.java @@ -23,14 +23,15 @@ import org.hibernate.event.spi.EventEngine; import org.hibernate.graph.spi.RootGraphImplementor; import org.hibernate.event.service.spi.EventListenerGroups; +import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.metamodel.spi.MappingMetamodelImplementor; import org.hibernate.metamodel.spi.RuntimeMetamodelsImplementor; import org.hibernate.proxy.EntityNotFoundDelegate; -import org.hibernate.query.sqm.spi.SqmCreationContext; +import org.hibernate.query.spi.QueryEngine; +import org.hibernate.query.sql.spi.SqlTranslationEngine; import org.hibernate.resource.beans.spi.ManagedBeanRegistry; import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.sql.ast.spi.ParameterMarkerStrategy; -import org.hibernate.sql.ast.spi.SqlAstCreationContext; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducerProvider; import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.generator.Generator; @@ -49,27 +50,16 @@ * @author Gavin King * @author Steve Ebersole */ -public interface SessionFactoryImplementor - extends MappingContext, SessionFactory, SqmCreationContext, SqlAstCreationContext { +public interface SessionFactoryImplementor extends MappingContext, SessionFactory { /** - * Get the UUID for this {@code SessionFactory}. + * The UUID assigned to this {@code SessionFactory}. *

- * The value is generated as a {@link java.util.UUID}, but kept as a String. - * - * @return The UUID for this {@code SessionFactory}. + * The value is generated as a {@link java.util.UUID}, but kept as a string. * * @see org.hibernate.internal.SessionFactoryRegistry#getSessionFactory */ String getUuid(); - /** - * Access to the name (if one) assigned to the {@code SessionFactory} - * - * @return The name for the {@code SessionFactory} - */ - @Override - String getName(); - /** * Overrides {@link SessionFactory#openSession()} to widen the return type: * this is useful for internal code depending on {@link SessionFactoryImplementor} @@ -80,35 +70,67 @@ public interface SessionFactoryImplementor @Override SessionImplementor openSession(); - @Override - TypeConfiguration getTypeConfiguration(); - - @Override - default SessionFactoryImplementor getSessionFactory() { - return this; - } - - @Override - default MappingMetamodelImplementor getMappingMetamodel() { - return getRuntimeMetamodels().getMappingMetamodel(); - } - + /** + * Obtain a {@linkplain org.hibernate.SessionBuilder session builder} + * for creating new instances of {@link org.hibernate.Session} with + * certain customized options. + */ @Override SessionBuilderImplementor withOptions(); /** - * Get a non-transactional "current" session (used by hibernate-envers) + * Get a non-transactional "current" session. + * + * @apiNote This is used by {@code hibernate-envers}. */ SessionImplementor openTemporarySession(); + /** + * Obtain the {@link CacheImplementor}. + */ @Override CacheImplementor getCache(); + /** + * Obtain the {@link StatisticsImplementor}. + */ @Override StatisticsImplementor getStatistics(); + /** + * Obtain the {@link TypeConfiguration} + */ + TypeConfiguration getTypeConfiguration(); + + /** + * Obtain the {@link RuntimeMetamodelsImplementor} + */ RuntimeMetamodelsImplementor getRuntimeMetamodels(); + /** + * Obtain the {@link MappingMetamodelImplementor} + */ + default MappingMetamodelImplementor getMappingMetamodel() { + return getRuntimeMetamodels().getMappingMetamodel(); + } + + /** + * Obtain the {@link JpaMetamodel} + */ + default JpaMetamodel getJpaMetamodel() { + return getRuntimeMetamodels().getJpaMetamodel(); + } + + /** + * Obtain the {@link QueryEngine} + */ + QueryEngine getQueryEngine(); + + /** + * Obtain the {@link SqlTranslationEngine} + */ + SqlTranslationEngine getSqlTranslationEngine(); + /** * Access to the {@code ServiceRegistry} for this {@code SessionFactory}. * @@ -122,11 +144,14 @@ default MappingMetamodelImplementor getMappingMetamodel() { EventEngine getEventEngine(); /** - * Retrieve fetch profile by name. + * Retrieve a {@linkplain FetchProfile fetch profile} by name. * * @param name The name of the profile to retrieve. * @return The profile definition + * + * @deprecated Use {@link SqlTranslationEngine#getFetchProfile(String)} */ + @Deprecated(since = "7.0", forRemoval = true) FetchProfile getFetchProfile(String name); /** @@ -137,25 +162,37 @@ default MappingMetamodelImplementor getMappingMetamodel() { @Deprecated(since = "7", forRemoval = true) Generator getGenerator(String rootEntityName); + /** + * Obtain the {@link EntityNotFoundDelegate} + */ EntityNotFoundDelegate getEntityNotFoundDelegate(); + /** + * Register a {@link SessionFactoryObserver} of this factory. + */ void addObserver(SessionFactoryObserver observer); + /** + * Obtain the {@link CustomEntityDirtinessStrategy} + */ //todo make a Service ? CustomEntityDirtinessStrategy getCustomEntityDirtinessStrategy(); + /** + * Obtain the {@link CurrentTenantIdentifierResolver} + */ //todo make a Service ? CurrentTenantIdentifierResolver getCurrentTenantIdentifierResolver(); /** - * The java type to use for a tenant identifier. + * The {@link JavaType} to use for a tenant identifier. * * @since 6.4 */ JavaType getTenantIdentifierJavaType(); /** - * Access to the event listener groups. + * Access to the {@linkplain EventListenerGroups event listener groups}. * * @since 7.0 */ @@ -163,36 +200,48 @@ default MappingMetamodelImplementor getMappingMetamodel() { EventListenerGroups getEventListenerGroups(); /** + * Obtain the {@link ParameterMarkerStrategy} service. + * * @since 7.0 */ @Incubating ParameterMarkerStrategy getParameterMarkerStrategy(); /** + * Obtain the {@link JdbcServices} service. + * * @since 7.0 */ @Incubating JdbcValuesMappingProducerProvider getJdbcValuesMappingProducerProvider(); /** + * Obtain the {@link EntityCopyObserverFactory} service. + * * @since 7.0 */ @Incubating EntityCopyObserverFactory getEntityCopyObserver(); /** + * Obtain the {@link ClassLoaderService}. + * * @since 7.0 */ @Incubating ClassLoaderService getClassLoaderService(); /** + * Obtain the {@link ManagedBeanRegistry} service. + * * @since 7.0 */ @Incubating ManagedBeanRegistry getManagedBeanRegistry(); /** + * Obtain the {@link EventListenerRegistry} service. + * * @since 7.0 */ @Incubating @@ -206,16 +255,35 @@ default MappingMetamodelImplementor getMappingMetamodel() { */ WrapperOptions getWrapperOptions(); + /** + * Get the {@linkplain SessionFactoryOptions options} used to build this factory. + */ @Override SessionFactoryOptions getSessionFactoryOptions(); + /** + * Obtain the {@linkplain FilterDefinition definition of a filter} by name. + * + * @param filterName The name of a declared filter + */ @Override FilterDefinition getFilterDefinition(String filterName); + /** + * Obtain a collection of {@link FilterDefinition}s representing all the + * {@linkplain org.hibernate.annotations.FilterDef#autoEnabled auto-enabled} + * filters. + */ Collection getAutoEnabledFilters(); + /** + * Obtain the {@link JdbcServices} service. + */ JdbcServices getJdbcServices(); + /** + * Obtain the {@link SqlStringGenerationContext}. + */ SqlStringGenerationContext getSqlStringGenerationContext(); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -228,4 +296,5 @@ default MappingMetamodelImplementor getMappingMetamodel() { * The best guess entity name for an entity not in an association */ String bestGuessEntityName(Object object); + } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/FetchProfileHelper.java b/hibernate-core/src/main/java/org/hibernate/internal/FetchProfileHelper.java index 3942209ee9f4..93ee4454e690 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/FetchProfileHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/FetchProfileHelper.java @@ -33,16 +33,22 @@ */ public class FetchProfileHelper { + @SuppressWarnings("unused") public static Map getFetchProfiles( MetadataImplementor bootMetamodel, RuntimeMetamodels runtimeMetamodels) { final Map fetchProfiles = new HashMap<>(); + addFetchProfiles( bootMetamodel, runtimeMetamodels, fetchProfiles ); + return fetchProfiles; + } + + static void addFetchProfiles( + MetadataImplementor bootMetamodel, RuntimeMetamodels runtimeMetamodels, Map fetchProfiles) { for ( org.hibernate.mapping.FetchProfile mappingProfile : bootMetamodel.getFetchProfiles() ) { final FetchProfile fetchProfile = createFetchProfile( runtimeMetamodels.getMappingMetamodel(), mappingProfile ); fetchProfiles.put( fetchProfile.getName(), fetchProfile ); } fetchProfiles.put( HIBERNATE_DEFAULT_PROFILE, new DefaultFetchProfile( runtimeMetamodels ) ); - return fetchProfiles; } private static FetchProfile createFetchProfile( @@ -53,7 +59,9 @@ private static FetchProfile createFetchProfile( for ( org.hibernate.mapping.FetchProfile.Fetch mappingFetch : mappingProfile.getFetches() ) { // resolve the persister owning the fetch final EntityPersister owner = getEntityPersister( mappingMetamodel, fetchProfile, mappingFetch ); - ( (FetchProfileAffectee) owner ).registerAffectingFetchProfile( profileName); + if ( owner instanceof FetchProfileAffectee fetchProfileAffectee ) { + fetchProfileAffectee.registerAffectingFetchProfile( profileName ); + } final Association association = new Association( owner, mappingFetch.getAssociation() ); final FetchStyle fetchStyle = fetchStyle( mappingFetch.getMethod() ); @@ -62,8 +70,8 @@ private static FetchProfile createFetchProfile( // validate the specified association fetch final ModelPart fetchablePart = owner.findByPath( association.getAssociationPath() ); validateFetchablePart( fetchablePart, profileName, association ); - if ( fetchablePart instanceof FetchProfileAffectee ) { - ( (FetchProfileAffectee) fetchablePart ).registerAffectingFetchProfile( profileName ); + if ( fetchablePart instanceof FetchProfileAffectee fetchProfileAffectee ) { + fetchProfileAffectee.registerAffectingFetchProfile( profileName ); } // then register the association with the FetchProfile @@ -73,16 +81,11 @@ private static FetchProfile createFetchProfile( } private static FetchStyle fetchStyle(FetchMode fetchMode) { - switch ( fetchMode ) { - case JOIN: - return FetchStyle.JOIN; - case SELECT: - return FetchStyle.SELECT; - case SUBSELECT: - return FetchStyle.SUBSELECT; - default: - throw new IllegalArgumentException( "Unknown FetchMode" ); - } + return switch ( fetchMode ) { + case JOIN -> FetchStyle.JOIN; + case SELECT -> FetchStyle.SELECT; + case SUBSELECT -> FetchStyle.SUBSELECT; + }; } private static void validateFetchablePart(ModelPart fetchablePart, String profileName, Association association) { 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 8b962b0db0ec..05efbd0f1043 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java @@ -94,12 +94,15 @@ import org.hibernate.procedure.spi.ProcedureCallImplementor; import org.hibernate.proxy.EntityNotFoundDelegate; import org.hibernate.proxy.LazyInitializer; +import org.hibernate.query.BindingContext; import org.hibernate.query.hql.spi.SqmQueryImplementor; import org.hibernate.query.internal.QueryEngineImpl; import org.hibernate.query.named.NamedObjectRepository; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.spi.QueryImplementor; +import org.hibernate.query.sql.internal.SqlTranslationEngineImpl; import org.hibernate.query.sql.spi.NativeQueryImplementor; +import org.hibernate.query.sql.spi.SqlTranslationEngine; import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.function.SqmFunctionRegistry; import org.hibernate.relational.SchemaManager; @@ -136,7 +139,7 @@ import static java.util.Collections.emptySet; import static java.util.Collections.unmodifiableSet; import static org.hibernate.cfg.AvailableSettings.CURRENT_SESSION_CONTEXT_CLASS; -import static org.hibernate.internal.FetchProfileHelper.getFetchProfiles; +import static org.hibernate.internal.FetchProfileHelper.addFetchProfiles; import static org.hibernate.internal.SessionFactorySettings.deprecationCheck; import static org.hibernate.internal.SessionFactorySettings.determineJndiName; import static org.hibernate.internal.SessionFactorySettings.getSessionFactoryName; @@ -166,7 +169,7 @@ * @author Steve Ebersole * @author Chris Cranford */ -public class SessionFactoryImpl implements SessionFactoryImplementor { +public class SessionFactoryImpl implements SessionFactoryImplementor, BindingContext { private static final CoreMessageLogger LOG = CoreLogging.messageLogger( SessionFactoryImpl.class ); private final String name; @@ -191,12 +194,13 @@ public class SessionFactoryImpl implements SessionFactoryImplementor { private final PersistenceUnitUtil jpaPersistenceUnitUtil; private final transient CacheImplementor cacheAccess; private final transient QueryEngine queryEngine; + private final transient SqlTranslationEngine sqlTranslationEngine; + private final transient TypeConfiguration typeConfiguration; private final transient CurrentSessionContext currentSessionContext; private final transient Map filters; private final transient java.util.Collection autoEnabledFilters = new HashSet<>(); - private final transient Map fetchProfiles; private final transient JavaType tenantIdentifierJavaType; private final transient EventListenerGroups eventListenerGroups; @@ -225,7 +229,7 @@ public SessionFactoryImpl( final SessionFactoryOptions options, final BootstrapContext bootstrapContext) { LOG.debug( "Building session factory" ); - final TypeConfiguration typeConfiguration = bootstrapContext.getTypeConfiguration(); + typeConfiguration = bootstrapContext.getTypeConfiguration(); sessionFactoryOptions = options; @@ -299,7 +303,9 @@ public SessionFactoryImpl( // created, then we can split creation of QueryEngine // and SqmFunctionRegistry, instantiating just the // registry here, and doing the engine later - queryEngine = QueryEngineImpl.from( bootMetamodel, options, this, serviceRegistry, settings, name ); + queryEngine = new QueryEngineImpl( bootMetamodel, options, this, serviceRegistry, settings, name ); + final Map fetchProfiles = new HashMap<>(); + sqlTranslationEngine = new SqlTranslationEngineImpl( this, typeConfiguration, fetchProfiles ); // create runtime metamodels (mapping and JPA) final RuntimeMetamodelsImpl runtimeMetamodelsImpl = new RuntimeMetamodelsImpl(); @@ -312,7 +318,7 @@ public SessionFactoryImpl( // this needs to happen after the mapping metamodel is // completely built, since we need to use the persisters - fetchProfiles = getFetchProfiles( bootMetamodel, runtimeMetamodelsImpl); + addFetchProfiles( bootMetamodel, runtimeMetamodelsImpl, fetchProfiles ); defaultSessionOpenOptions = createDefaultSessionOpenOptionsIfPossible(); temporarySessionOpenOptions = defaultSessionOpenOptions == null ? null : buildTemporarySessionOpenOptions(); @@ -617,7 +623,7 @@ public String getJndiName() { @Override public TypeConfiguration getTypeConfiguration() { - return runtimeMetamodels.getMappingMetamodel().getTypeConfiguration(); + return typeConfiguration; } @Override @@ -625,6 +631,11 @@ public QueryEngine getQueryEngine() { return queryEngine; } + @Override + public SqlTranslationEngine getSqlTranslationEngine() { + return sqlTranslationEngine; + } + @Override public EventEngine getEventEngine() { return eventEngine; @@ -1024,18 +1035,23 @@ public java.util.Collection getAutoEnabledFilters() { } @Override - public boolean containsFetchProfileDefinition(String name) { - return fetchProfiles.containsKey( name ); + public Set getDefinedFilterNames() { + return unmodifiableSet( filters.keySet() ); } @Override - public Set getDefinedFilterNames() { - return unmodifiableSet( filters.keySet() ); + public FetchProfile getFetchProfile(String name) { + return sqlTranslationEngine.getFetchProfile( name ); + } + + @Override + public boolean containsFetchProfileDefinition(String name) { + return sqlTranslationEngine.containsFetchProfileDefinition( name ); } @Override public Set getDefinedFetchProfileNames() { - return unmodifiableSet( fetchProfiles.keySet() ); + return sqlTranslationEngine.getDefinedFetchProfileNames(); } @Override @Deprecated @@ -1105,11 +1121,6 @@ public JpaMetamodelImplementor getJpaMetamodel() { return runtimeMetamodels.getJpaMetamodel(); } - @Override - public Integer getMaximumFetchDepth() { - return getSessionFactoryOptions().getMaximumFetchDepth(); - } - @Override public ServiceRegistryImplementor getServiceRegistry() { return serviceRegistry; @@ -1120,11 +1131,6 @@ public EntityNotFoundDelegate getEntityNotFoundDelegate() { return sessionFactoryOptions.getEntityNotFoundDelegate(); } - @Override - public FetchProfile getFetchProfile(String name) { - return fetchProfiles.get( name ); - } - /** * @deprecated use {@link #configuredInterceptor(Interceptor, boolean, SessionFactoryOptions)} */ @@ -1411,7 +1417,8 @@ public StatelessSessionBuilderImpl(SessionFactoryImpl sessionFactory) { this.sessionFactory = sessionFactory; this.statementInspector = sessionFactory.getSessionFactoryOptions().getStatementInspector(); - CurrentTenantIdentifierResolver tenantIdentifierResolver = sessionFactory.getCurrentTenantIdentifierResolver(); + final CurrentTenantIdentifierResolver tenantIdentifierResolver = + sessionFactory.getCurrentTenantIdentifierResolver(); if ( tenantIdentifierResolver != null ) { tenantIdentifier = tenantIdentifierResolver.resolveCurrentTenantIdentifier(); } @@ -1655,8 +1662,8 @@ public SchemaManager getSchemaManager() { } @Override - public Class classForName(String className) { - return getClassLoaderService().classForName( className ); + public MappingMetamodelImplementor getMappingMetamodel() { + return getRuntimeMetamodels().getMappingMetamodel(); } private enum Status { diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java index 2aab7b4ea7fa..048f5ae4c344 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java @@ -3016,7 +3016,8 @@ private void readObject(ObjectInputStream ois) throws IOException, ClassNotFound // filter, which will fail when called before FilterImpl#afterDeserialize( factory ); // Instead lookup the filter by name and then call FilterImpl#afterDeserialize( factory ). for ( String filterName : loadQueryInfluencers.getEnabledFilterNames() ) { - ( (FilterImpl) loadQueryInfluencers.getEnabledFilter( filterName ) ).afterDeserialize( getFactory() ); + ( (FilterImpl) loadQueryInfluencers.getEnabledFilter( filterName ) ) + .afterDeserialize( getFactory() ); } eventListenerGroups = getFactory().getEventListenerGroups(); diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java index 61443ad7f04c..2fd84e6af925 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java @@ -120,7 +120,7 @@ public T load(Object naturalIdValue, NaturalIdLoadOptions options, SharedSession (fetchParent, creationState) -> ImmutableFetchList.EMPTY, true, new LoadQueryInfluencers( sessionFactory ), - sessionFactory + sessionFactory.getSqlTranslationEngine() ), session ); @@ -192,7 +192,7 @@ protected L selectByNaturalId( fetchProcessor, true, new LoadQueryInfluencers( sessionFactory ), - sessionFactory + sessionFactory.getSqlTranslationEngine() ); final TableGroup rootTableGroup = entityDescriptor.createRootTableGroup( diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java index d994c877aaf8..22f86ce33f22 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java @@ -74,7 +74,7 @@ class DatabaseSnapshotExecutor { (fetchParent, creationState) -> ImmutableFetchList.EMPTY, true, new LoadQueryInfluencers( sessionFactory ), - sessionFactory + sessionFactory.getSqlTranslationEngine() ); final NavigablePath rootPath = new NavigablePath( entityDescriptor.getEntityName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java index 05c9cc74f41e..0da477b6f0fa 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java @@ -41,6 +41,7 @@ import org.hibernate.metamodel.mapping.internal.SimpleForeignKeyDescriptor; import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping; import org.hibernate.metamodel.mapping.ordering.OrderByFragment; +import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.query.sqm.ComparisonOperator; import org.hibernate.spi.EntityIdentifierNavigablePath; import org.hibernate.spi.NavigablePath; @@ -119,7 +120,7 @@ public static SelectStatement createSelectByUniqueKey( Consumer jdbcParameterConsumer, SessionFactoryImplementor sessionFactory) { final LoaderSelectBuilder process = new LoaderSelectBuilder( - sessionFactory, + sessionFactory.getSqlTranslationEngine(), loadable, partsToSelect, singletonList( restrictedPart ), @@ -127,7 +128,7 @@ public static SelectStatement createSelectByUniqueKey( 1, loadQueryInfluencers, lockOptions, - determineGraphTraversalState( loadQueryInfluencers, sessionFactory ), + determineGraphTraversalState( loadQueryInfluencers, sessionFactory.getJpaMetamodel() ), true, jdbcParameterConsumer ); @@ -146,7 +147,7 @@ public static SelectStatement createSelectBySingleArrayParameter( JdbcParameter jdbcArrayParameter, SessionFactoryImplementor sessionFactory) { final LoaderSelectBuilder builder = new LoaderSelectBuilder( - sessionFactory, + sessionFactory.getSqlTranslationEngine(), loadable, null, singletonList( restrictedPart ), @@ -154,7 +155,7 @@ public static SelectStatement createSelectBySingleArrayParameter( -1, influencers, lockOptions, - determineGraphTraversalState( influencers, sessionFactory ), + determineGraphTraversalState( influencers, sessionFactory.getJpaMetamodel() ), true, null ); @@ -239,7 +240,7 @@ public static SelectStatement createSelect( Consumer jdbcParameterConsumer, SessionFactoryImplementor sessionFactory) { final LoaderSelectBuilder process = new LoaderSelectBuilder( - sessionFactory, + sessionFactory.getSqlTranslationEngine(), loadable, partsToSelect, restrictedPart, @@ -264,7 +265,7 @@ public static SelectStatement createSelect( Consumer jdbcParameterConsumer, SessionFactoryImplementor sessionFactory) { final LoaderSelectBuilder process = new LoaderSelectBuilder( - sessionFactory, + sessionFactory.getSqlTranslationEngine(), loadable, partsToSelect, restrictedParts, @@ -292,7 +293,7 @@ static SelectStatement createSelect( Consumer jdbcParameterConsumer, SessionFactoryImplementor sessionFactory) { final LoaderSelectBuilder process = new LoaderSelectBuilder( - sessionFactory, + sessionFactory.getSqlTranslationEngine(), loadable, partsToSelect, restrictedParts, @@ -300,7 +301,7 @@ static SelectStatement createSelect( numberOfKeysToLoad, loadQueryInfluencers, lockOptions, - determineGraphTraversalState( loadQueryInfluencers, sessionFactory ), + determineGraphTraversalState( loadQueryInfluencers, sessionFactory.getJpaMetamodel() ), forceIdentifierSelection, jdbcParameterConsumer ); @@ -330,7 +331,7 @@ public static SelectStatement createSubSelectFetchSelect( Consumer jdbcParameterConsumer, SessionFactoryImplementor sessionFactory) { final LoaderSelectBuilder process = new LoaderSelectBuilder( - sessionFactory, + sessionFactory.getSqlTranslationEngine(), attributeMapping, null, attributeMapping.getKeyDescriptor(), @@ -410,7 +411,7 @@ private LoaderSelectBuilder( numberOfKeysToLoad, loadQueryInfluencers, lockOptions != null ? lockOptions : LockOptions.NONE, - determineGraphTraversalState( loadQueryInfluencers, creationContext.getSessionFactory() ), + determineGraphTraversalState( loadQueryInfluencers, creationContext.getJpaMetamodel() ), determineWhetherToForceIdSelection( numberOfKeysToLoad, restrictedParts ), jdbcParameterConsumer ); @@ -462,7 +463,7 @@ private static boolean determineWhetherToForceIdSelection(int numberOfKeysToLoad private static EntityGraphTraversalState determineGraphTraversalState( LoadQueryInfluencers loadQueryInfluencers, - SessionFactoryImplementor sessionFactory) { + JpaMetamodel jpaMetamodel) { if ( loadQueryInfluencers != null ) { final EffectiveEntityGraph effectiveEntityGraph = loadQueryInfluencers.getEffectiveEntityGraph(); if ( effectiveEntityGraph != null ) { @@ -472,7 +473,7 @@ private static EntityGraphTraversalState determineGraphTraversalState( return new StandardEntityGraphTraversalStateImpl( graphSemantic, rootGraphImplementor, - sessionFactory.getJpaMetamodel() + jpaMetamodel ); } } @@ -872,8 +873,8 @@ else if ( loadQueryInfluencers.hasEnabledFetchProfiles() ) { final String fetchableRole = fetchable.getNavigableRole().getFullPath(); for ( String enabledFetchProfileName : loadQueryInfluencers.getEnabledFetchProfileNames() ) { - final FetchProfile enabledFetchProfile = creationContext.getSessionFactory() - .getFetchProfile( enabledFetchProfileName ); + final FetchProfile enabledFetchProfile = + creationContext.getFetchProfile( enabledFetchProfileName ); final org.hibernate.engine.profile.Fetch profileFetch = enabledFetchProfile.getFetchByRole( fetchableRole ); if ( profileFetch != null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderStandardImpl.java index 461d9fe152af..bff8f0e2b2b9 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderStandardImpl.java @@ -36,7 +36,8 @@ public SingleIdEntityLoaderStandardImpl( this( entityDescriptor, loadQueryInfluencers, - (lockOptions, influencers) -> createLoadPlan( entityDescriptor, lockOptions, influencers, influencers.getSessionFactory() ) + (lockOptions, influencers) -> + createLoadPlan( entityDescriptor, lockOptions, influencers, influencers.getSessionFactory() ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ForeignKeyDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ForeignKeyDescriptor.java index d548a2bcbd01..6f37479ac140 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ForeignKeyDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ForeignKeyDescriptor.java @@ -194,7 +194,6 @@ public Nature inverse() { interface Side { Nature getNature(); ValuedModelPart getModelPart(); - } boolean isEmbedded(); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDiscriminatorMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDiscriminatorMapping.java index ae4c3648e018..a6054874e50d 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDiscriminatorMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractDiscriminatorMapping.java @@ -137,7 +137,7 @@ private SqlSelection resolveSqlSelection( resolveSqlExpression( navigablePath, jdbcMappingToUse, tableGroup, creationState ), jdbcMappingToUse.getJdbcJavaType(), fetchParent, - creationState.getCreationContext().getSessionFactory().getTypeConfiguration() + creationState.getCreationContext().getTypeConfiguration() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyDiscriminatorPart.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyDiscriminatorPart.java index f320d3e25108..f170098d765a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyDiscriminatorPart.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyDiscriminatorPart.java @@ -7,7 +7,6 @@ import org.hibernate.cache.MutableCacheKeyBuilder; import org.hibernate.engine.FetchStyle; import org.hibernate.engine.FetchTiming; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.IndexedConsumer; import org.hibernate.metamodel.mapping.DiscriminatedAssociationModelPart; @@ -313,7 +312,6 @@ public BasicFetch generateFetch( String resultVariable, DomainResultCreationState creationState) { final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState(); - final SessionFactoryImplementor sessionFactory = sqlAstCreationState.getCreationContext().getSessionFactory(); final FromClauseAccess fromClauseAccess = sqlAstCreationState.getFromClauseAccess(); final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); @@ -327,7 +325,7 @@ public BasicFetch generateFetch( columnReference, jdbcMapping().getJdbcJavaType(), fetchParent, - sessionFactory.getTypeConfiguration() + sqlAstCreationState.getCreationContext().getTypeConfiguration() ); return new BasicFetch<>( @@ -407,7 +405,7 @@ private SqlSelection resolveSqlSelection( resolveSqlExpression( navigablePath, null, tableGroup, sqlAstCreationState ), jdbcMapping().getJdbcJavaType(), null, - creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration() + creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyKeyPart.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyKeyPart.java index 6abc95dfdbf8..0a609ed8f05b 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyKeyPart.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AnyKeyPart.java @@ -8,7 +8,6 @@ import org.hibernate.engine.FetchStyle; import org.hibernate.engine.FetchTiming; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.IndexedConsumer; import org.hibernate.metamodel.mapping.BasicValuedModelPart; @@ -219,10 +218,6 @@ public Fetch generateFetch( final SqlExpressionResolver sqlExpressionResolver = creationState .getSqlAstCreationState() .getSqlExpressionResolver(); - final SessionFactoryImplementor sessionFactory = creationState - .getSqlAstCreationState() - .getCreationContext() - .getSessionFactory(); final TableGroup tableGroup = fromClauseAccess.getTableGroup( fetchParent.getNavigablePath().getParent() ); final TableReference tableReference = tableGroup.resolveTableReference( fetchablePath, table ); @@ -236,7 +231,7 @@ public Fetch generateFetch( columnReference, jdbcMapping.getJdbcJavaType(), fetchParent, - sessionFactory.getTypeConfiguration() + creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); return new BasicFetch<>( @@ -371,7 +366,7 @@ private SqlSelection resolveSqlSelection( ), jdbcMapping.getJdbcJavaType(), null, - creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration() + creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicAttributeMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicAttributeMapping.java index 62450daf3959..4550cdefb589 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicAttributeMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicAttributeMapping.java @@ -355,7 +355,7 @@ private SqlSelection resolveSqlSelection( ), jdbcMapping.getJdbcJavaType(), fetchParent, - creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration() + creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicValuedCollectionPart.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicValuedCollectionPart.java index 1aa401aff2f1..b0447b3ee19a 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicValuedCollectionPart.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/BasicValuedCollectionPart.java @@ -205,7 +205,7 @@ private SqlSelection resolveSqlSelection( ), getJdbcMapping().getJdbcJavaType(), fetchParent, - creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration() + creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CollectionIdentifierDescriptorImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CollectionIdentifierDescriptorImpl.java index e01afb26c944..54a30c4cedf1 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CollectionIdentifierDescriptorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CollectionIdentifierDescriptorImpl.java @@ -9,7 +9,6 @@ import org.hibernate.cache.MutableCacheKeyBuilder; import org.hibernate.engine.FetchStyle; import org.hibernate.engine.FetchTiming; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.util.IndexedConsumer; import org.hibernate.metamodel.mapping.CollectionIdentifierDescriptor; @@ -255,8 +254,6 @@ public Fetch generateFetch( final TableGroup tableGroup = fromClauseAccess.getTableGroup( fetchablePath.getParent() ); final SqlAstCreationState astCreationState = creationState.getSqlAstCreationState(); - final SqlAstCreationContext astCreationContext = astCreationState.getCreationContext(); - final SessionFactoryImplementor sessionFactory = astCreationContext.getSessionFactory(); final SqlExpressionResolver sqlExpressionResolver = astCreationState.getSqlExpressionResolver(); final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( @@ -266,7 +263,7 @@ public Fetch generateFetch( ), type.getJdbcJavaType(), fetchParent, - sessionFactory.getTypeConfiguration() + astCreationState.getCreationContext().getTypeConfiguration() ); return new BasicFetch<>( @@ -286,7 +283,6 @@ public DomainResult createDomainResult( DomainResultCreationState creationState) { final SqlAstCreationState astCreationState = creationState.getSqlAstCreationState(); final SqlAstCreationContext astCreationContext = astCreationState.getCreationContext(); - final SessionFactoryImplementor sessionFactory = astCreationContext.getSessionFactory(); final SqlExpressionResolver sqlExpressionResolver = astCreationState.getSqlExpressionResolver(); final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( @@ -296,7 +292,7 @@ public DomainResult createDomainResult( ), type.getJdbcJavaType(), null, - sessionFactory.getTypeConfiguration() + astCreationContext.getTypeConfiguration() ); return new BasicResult<>( diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java index 64cd2e81be9d..7078baa59922 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/CompoundNaturalIdMapping.java @@ -285,7 +285,7 @@ public DomainResult createDomainResult(NavigablePath navigablePath, Table assert navigablePath.getLocalName().equals( NaturalIdMapping.PART_NAME ); final JavaType jtd = - creationState.getSqlAstCreationState().getCreationContext().getSessionFactory() + creationState.getSqlAstCreationState().getCreationContext() .getTypeConfiguration().getJavaTypeRegistry() .getDescriptor( Object[].class ); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityRowIdMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityRowIdMappingImpl.java index 644aedf79b58..c77ea4b8dff1 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityRowIdMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityRowIdMappingImpl.java @@ -99,7 +99,7 @@ public DomainResult createDomainResult( sqlExpressionResolver.resolveSqlExpression( columnTableReference, this ), rowIdType.getJdbcJavaType(), null, - sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration() + sqlAstCreationState.getCreationContext().getTypeConfiguration() ); return new BasicResult<>( diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityVersionMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityVersionMappingImpl.java index 58a9778362a6..f402fae42a0d 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityVersionMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/EntityVersionMappingImpl.java @@ -245,7 +245,7 @@ public Fetch generateFetch( sqlExpressionResolver.resolveSqlExpression( columnTableReference, this ), versionBasicType.getJdbcJavaType(), fetchParent, - sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration() + sqlAstCreationState.getCreationContext().getTypeConfiguration() ); return new BasicFetch<>( @@ -318,7 +318,7 @@ private SqlSelection resolveSqlSelection(TableGroup tableGroup, DomainResultCrea sqlExpressionResolver.resolveSqlExpression( columnTableReference, this ), versionBasicType.getJdbcJavaType(), null, - sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration() + sqlAstCreationState.getCreationContext().getTypeConfiguration() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleForeignKeyDescriptor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleForeignKeyDescriptor.java index 483616d98cec..c3a021e7ad6e 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleForeignKeyDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleForeignKeyDescriptor.java @@ -386,7 +386,7 @@ private DomainResult createDomainResult( sqlExpressionResolver.resolveSqlExpression( tableReference, selectableMapping ), javaType, fetchParent, - sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration() + sqlAstCreationState.getCreationContext().getTypeConfiguration() ); final JdbcMappingContainer selectionType = sqlSelection.getExpressionType(); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ordering/ast/OrderingExpression.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ordering/ast/OrderingExpression.java index a09b18bb053f..bc275a51fe06 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ordering/ast/OrderingExpression.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ordering/ast/OrderingExpression.java @@ -50,8 +50,7 @@ static Expression applyCollation( } else { final QueryEngine queryEngine = - creationState.getCreationContext().getSessionFactory() - .getQueryEngine(); + creationState.getSqmCreationContext().getQueryEngine(); final SqmToSqlAstConverter converter = creationState instanceof SqmToSqlAstConverter sqmToSqlAstConverter ? sqmToSqlAstConverter diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java index 9601fc260828..3a4aa9395f39 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java @@ -941,7 +941,7 @@ public String selectFragment(String alias, String columnSuffix) { (fetchParent, creationState) -> ImmutableFetchList.EMPTY, true, new LoadQueryInfluencers( factory ), - factory + factory.getSqlTranslationEngine() ); final NavigablePath entityPath = new NavigablePath( attributeMapping.getRootPathName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index e5c6785c8185..a44e3eb4eb1f 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -1838,7 +1838,7 @@ public String selectFragment(String alias, String suffix) { this::fetchProcessor, true, new LoadQueryInfluencers( factory ), - factory + factory.getSqlTranslationEngine() ); final NavigablePath entityPath = new NavigablePath( getRootPathName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/ExplicitSqlStringGenerationContext.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/ExplicitSqlStringGenerationContext.java index 670dd334f0c6..48ce93083f0b 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/ExplicitSqlStringGenerationContext.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/ExplicitSqlStringGenerationContext.java @@ -38,6 +38,10 @@ public ExplicitSqlStringGenerationContext( : toIdentifier( factory.getSessionFactoryOptions().getDefaultSchema() ); } + private JdbcEnvironment getJdbcEnvironment() { + return factory.getJdbcServices().getJdbcEnvironment(); + } + @Override public Dialect getDialect() { return factory.getJdbcServices().getDialect(); @@ -45,7 +49,7 @@ public Dialect getDialect() { @Override public Identifier toIdentifier(String text) { - return factory.getJdbcServices().getJdbcEnvironment().getIdentifierHelper().toIdentifier( text ); + return getJdbcEnvironment().getIdentifierHelper().toIdentifier( text ); } @Override @@ -64,9 +68,8 @@ public String format(QualifiedTableName qualifiedName) { } private QualifiedObjectNameFormatter nameFormater() { - final JdbcEnvironment jdbcEnvironment = factory.getJdbcServices().getJdbcEnvironment(); //noinspection deprecation - return jdbcEnvironment.getQualifiedObjectNameFormatter(); + return getJdbcEnvironment().getQualifiedObjectNameFormatter(); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java index ad1f20813b97..d64ecf529577 100644 --- a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java @@ -567,7 +567,8 @@ private Class getExpressibleJavaType(BindableType parameterType) { return null; } else { - final SqmExpressible sqmExpressible = parameterType.resolveExpressible( getSessionFactory() ); + final SqmExpressible sqmExpressible = + parameterType.resolveExpressible( getSessionFactory().getQueryEngine().getCriteriaBuilder() ); assert sqmExpressible != null; return sqmExpressible.getExpressibleJavaType().getJavaTypeClass(); diff --git a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterImpl.java b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterImpl.java index b0d6fae5fc9c..c76bfabe5c67 100644 --- a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterImpl.java @@ -111,7 +111,7 @@ public JdbcCallParameterRegistration toJdbcParameterRegistration( final OutputableType typeToUse = (OutputableType) BindingTypeHelper.INSTANCE.resolveTemporalPrecision( binding == null ? null : binding.getExplicitTemporalPrecision(), bindableType, - session.getFactory() + session.getFactory().getQueryEngine().getCriteriaBuilder() ); final String jdbcParamName; diff --git a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ScalarDomainResultBuilder.java b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ScalarDomainResultBuilder.java index 8dd11343e32e..5277c970ee46 100644 --- a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ScalarDomainResultBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ScalarDomainResultBuilder.java @@ -15,6 +15,7 @@ import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; import org.hibernate.type.BasicType; import org.hibernate.type.descriptor.java.JavaType; +import org.hibernate.type.spi.TypeConfiguration; /** * @author Steve Ebersole @@ -36,8 +37,10 @@ public DomainResult buildResult( JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, DomainResultCreationState domainResultCreationState) { - final SqlExpressionResolver sqlExpressionResolver = domainResultCreationState.getSqlAstCreationState() - .getSqlExpressionResolver(); + final SqlExpressionResolver sqlExpressionResolver = + domainResultCreationState.getSqlAstCreationState().getSqlExpressionResolver(); + final TypeConfiguration typeConfiguration = + domainResultCreationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration(); final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlExpression( SqlExpressionResolver.createColumnReferenceKey( @@ -47,17 +50,14 @@ public DomainResult buildResult( final BasicType basicType = jdbcResultsMetadata.resolveType( resultPosition + 1, typeDescriptor, - processingState.getSqlAstCreationState().getCreationContext().getSessionFactory() + typeConfiguration ); return new ResultSetMappingSqlSelection( resultPosition, (BasicValuedMapping) basicType ); } ), typeDescriptor, null, - domainResultCreationState.getSqlAstCreationState() - .getCreationContext() - .getSessionFactory() - .getTypeConfiguration() + typeConfiguration ); return new BasicResult<>( sqlSelection.getValuesArrayPosition(), diff --git a/hibernate-core/src/main/java/org/hibernate/procedure/internal/Util.java b/hibernate-core/src/main/java/org/hibernate/procedure/internal/Util.java index 982595c7d10b..a9eb38f5c451 100644 --- a/hibernate-core/src/main/java/org/hibernate/procedure/internal/Util.java +++ b/hibernate-core/src/main/java/org/hibernate/procedure/internal/Util.java @@ -7,7 +7,7 @@ import java.util.function.Consumer; import org.hibernate.internal.util.collections.ArrayHelper; -import org.hibernate.metamodel.spi.MappingMetamodelImplementor; +import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.UnknownSqlResultSetMappingException; import org.hibernate.query.internal.ResultSetMappingResolutionContext; @@ -52,8 +52,7 @@ public static void resolveResultSetMappingNames( ResultSetMapping resultSetMapping, Consumer querySpaceConsumer, ResultSetMappingResolutionContext context) { - final NamedObjectRepository namedObjectRepository = - context.getSessionFactory().getQueryEngine().getNamedObjectRepository(); + final NamedObjectRepository namedObjectRepository = context.getNamedObjectRepository(); for ( String resultSetMappingName : resultSetMappingNames ) { final NamedResultSetMappingMemento memento = namedObjectRepository.getResultSetMappingMemento( resultSetMappingName ); @@ -73,7 +72,7 @@ public static void resolveResultSetMappingClasses( ResultSetMapping resultSetMapping, Consumer querySpaceConsumer, ResultSetMappingResolutionContext context) { - final MappingMetamodelImplementor mappingMetamodel = context.getSessionFactory().getRuntimeMetamodels().getMappingMetamodel(); + final MappingMetamodel mappingMetamodel = context.getMappingMetamodel(); final JavaTypeRegistry javaTypeRegistry = mappingMetamodel.getTypeConfiguration().getJavaTypeRegistry(); for ( Class resultSetMappingClass : resultSetMappingClasses ) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/BindingContext.java b/hibernate-core/src/main/java/org/hibernate/query/BindingContext.java index 6d38eff7456c..648e42e203fa 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/BindingContext.java +++ b/hibernate-core/src/main/java/org/hibernate/query/BindingContext.java @@ -16,6 +16,11 @@ * @author Gavin King * * @since 7 + * + * @see BindableType#resolveExpressible(BindingContext) + * @see org.hibernate.query.sqm.SqmExpressible#resolveExpressible(BindingContext) + * @see org.hibernate.query.sqm.produce.function.ArgumentsValidator#validate(java.util.List, String, BindingContext) + * @see org.hibernate.query.sqm.internal.TypecheckUtil */ @Incubating public interface BindingContext { @@ -23,7 +28,5 @@ public interface BindingContext { MappingMetamodel getMappingMetamodel(); - default TypeConfiguration getTypeConfiguration() { - return getJpaMetamodel().getTypeConfiguration(); - } + TypeConfiguration getTypeConfiguration(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java index 3690cbb10799..5137d033d6b9 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java @@ -14,6 +14,8 @@ import org.hibernate.engine.query.spi.NativeQueryInterpreter; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.util.config.ConfigurationHelper; +import org.hibernate.metamodel.MappingMetamodel; +import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.query.BindingContext; import org.hibernate.query.hql.HqlTranslator; import org.hibernate.query.hql.internal.StandardHqlTranslator; @@ -51,103 +53,54 @@ public class QueryEngineImpl implements QueryEngine { private static final Logger LOG_HQL_FUNCTIONS = CoreLogging.logger("org.hibernate.HQL_FUNCTIONS"); - public static QueryEngineImpl from( - MetadataImplementor metadata, - QueryEngineOptions options, - SqmCreationContext sqmCreationContext, - ServiceRegistryImplementor serviceRegistry, - Map properties, - String name) { - final Dialect dialect = serviceRegistry.requireService( JdbcServices.class ).getDialect(); - return new QueryEngineImpl( - metadata.getTypeConfiguration(), - resolveHqlTranslator( options, dialect, sqmCreationContext, new SqmCreationOptionsStandard( options ) ), - resolveSqmTranslatorFactory( options, dialect ), - createFunctionRegistry( serviceRegistry, metadata, options, dialect ), - metadata.buildNamedQueryRepository(), - buildInterpretationCache( serviceRegistry, properties ), - serviceRegistry.getService(NativeQueryInterpreter.class), - sqmCreationContext, - options, - options.getUuid(), - name - ); - } - - private static SqmFunctionRegistry createFunctionRegistry( - ServiceRegistry serviceRegistry, - MetadataImplementor metadata, - QueryEngineOptions queryEngineOptions, - Dialect dialect) { - final SqmFunctionRegistry sqmFunctionRegistry = metadata.getFunctionRegistry(); - - queryEngineOptions.getCustomSqlFunctionMap().forEach( sqmFunctionRegistry::register ); - - final SqmFunctionRegistry customSqmFunctionRegistry = queryEngineOptions.getCustomSqmFunctionRegistry(); - if ( customSqmFunctionRegistry != null ) { - customSqmFunctionRegistry.overlay( sqmFunctionRegistry ); - } - - //TODO: probably better to turn this back into an anonymous class - final FunctionContributions functionContributions = - new FunctionContributionsImpl( serviceRegistry, metadata.getTypeConfiguration(), sqmFunctionRegistry ); - for ( FunctionContributor contributor : sortedFunctionContributors( serviceRegistry ) ) { - contributor.contributeFunctions( functionContributions ); - } - - dialect.initializeFunctionRegistry( functionContributions ); - - if ( LOG_HQL_FUNCTIONS.isDebugEnabled() ) { - sqmFunctionRegistry.getFunctionsByName() - .forEach( entry -> LOG_HQL_FUNCTIONS.debug( entry.getValue().getSignature( entry.getKey() ) ) ); - } - - return sqmFunctionRegistry; - } - private final TypeConfiguration typeConfiguration; private final NamedObjectRepository namedObjectRepository; private final NativeQueryInterpreter nativeQueryInterpreter; + private final BindingContext bindingContext; + private final ClassLoaderService classLoaderService; private final QueryInterpretationCache interpretationCache; - private final NodeBuilder criteriaBuilder; + private final NodeBuilder nodeBuilder; private final HqlTranslator hqlTranslator; private final SqmTranslatorFactory sqmTranslatorFactory; private final SqmFunctionRegistry sqmFunctionRegistry; + private final Dialect dialect; - private QueryEngineImpl( - TypeConfiguration typeConfiguration, - HqlTranslator hqlTranslator, - SqmTranslatorFactory sqmTranslatorFactory, - SqmFunctionRegistry functionRegistry, - NamedObjectRepository namedObjectRepository, - QueryInterpretationCache interpretationCache, - NativeQueryInterpreter nativeQueryInterpreter, - BindingContext context, + public QueryEngineImpl( + MetadataImplementor metadata, QueryEngineOptions options, - String uuid, String name) { - this.typeConfiguration = typeConfiguration; - this.sqmFunctionRegistry = functionRegistry; - this.sqmTranslatorFactory = sqmTranslatorFactory; - this.hqlTranslator = hqlTranslator; - this.namedObjectRepository = namedObjectRepository; - this.interpretationCache = interpretationCache; - this.nativeQueryInterpreter = nativeQueryInterpreter; - this.criteriaBuilder = createCriteriaBuilder( context, options, uuid, name ); + BindingContext context, + ServiceRegistryImplementor serviceRegistry, + Map properties, + String name) { + this.dialect = serviceRegistry.requireService( JdbcServices.class ).getDialect(); + this.bindingContext = context; + this.typeConfiguration = metadata.getTypeConfiguration(); + this.sqmFunctionRegistry = createFunctionRegistry( serviceRegistry, metadata, options, dialect ); + this.sqmTranslatorFactory = resolveSqmTranslatorFactory( options, dialect ); + this.namedObjectRepository = metadata.buildNamedQueryRepository(); + this.interpretationCache = buildInterpretationCache( serviceRegistry, properties ); + this.nativeQueryInterpreter = serviceRegistry.getService( NativeQueryInterpreter.class ); + this.classLoaderService = serviceRegistry.getService( ClassLoaderService.class ); + // here we have something nasty: we need to pass a reference to the current object to + // create the NodeBuilder, but then we need the NodeBuilder to create the HqlTranslator + // and that's only because we're using the NodeBuilder as the SqmCreationContext + this.nodeBuilder = createCriteriaBuilder( context, this, options, options.getUuid(), name ); + this.hqlTranslator = resolveHqlTranslator( options, dialect, nodeBuilder ); } - private SqmCriteriaNodeBuilder createCriteriaBuilder( - BindingContext context, QueryEngineOptions options, + private static SqmCriteriaNodeBuilder createCriteriaBuilder( + BindingContext context, QueryEngine engine, QueryEngineOptions options, String uuid, String name) { - return new SqmCriteriaNodeBuilder( uuid, name, this, options, context ); + return new SqmCriteriaNodeBuilder( uuid, name, engine, options, context ); } private static HqlTranslator resolveHqlTranslator( - QueryEngineOptions runtimeOptions, + QueryEngineOptions options, Dialect dialect, - SqmCreationContext sqmCreationContext, - SqmCreationOptions sqmCreationOptions) { - if ( runtimeOptions.getCustomHqlTranslator() != null ) { - return runtimeOptions.getCustomHqlTranslator(); + SqmCreationContext sqmCreationContext) { + final SqmCreationOptions sqmCreationOptions = new SqmCreationOptionsStandard( options ); + if ( options.getCustomHqlTranslator() != null ) { + return options.getCustomHqlTranslator(); } else if ( dialect.getHqlTranslator() != null ) { return dialect.getHqlTranslator(); @@ -171,6 +124,37 @@ else if ( dialect.getSqmTranslatorFactory() != null ) { } } + private static SqmFunctionRegistry createFunctionRegistry( + ServiceRegistry serviceRegistry, + MetadataImplementor metadata, + QueryEngineOptions queryEngineOptions, + Dialect dialect) { + final SqmFunctionRegistry sqmFunctionRegistry = metadata.getFunctionRegistry(); + + queryEngineOptions.getCustomSqlFunctionMap().forEach( sqmFunctionRegistry::register ); + + final SqmFunctionRegistry customSqmFunctionRegistry = queryEngineOptions.getCustomSqmFunctionRegistry(); + if ( customSqmFunctionRegistry != null ) { + customSqmFunctionRegistry.overlay( sqmFunctionRegistry ); + } + + //TODO: probably better to turn this back into an anonymous class + final FunctionContributions functionContributions = + new FunctionContributionsImpl( serviceRegistry, metadata.getTypeConfiguration(), sqmFunctionRegistry ); + for ( FunctionContributor contributor : sortedFunctionContributors( serviceRegistry ) ) { + contributor.contributeFunctions( functionContributions ); + } + + dialect.initializeFunctionRegistry( functionContributions ); + + if ( LOG_HQL_FUNCTIONS.isDebugEnabled() ) { + sqmFunctionRegistry.getFunctionsByName() + .forEach( entry -> LOG_HQL_FUNCTIONS.debug( entry.getValue().getSignature( entry.getKey() ) ) ); + } + + return sqmFunctionRegistry; + } + private static List sortedFunctionContributors(ServiceRegistry serviceRegistry) { final Collection functionContributors = serviceRegistry.requireService(ClassLoaderService.class) @@ -227,7 +211,12 @@ public TypeConfiguration getTypeConfiguration() { @Override public NodeBuilder getCriteriaBuilder() { - return criteriaBuilder; + return nodeBuilder; + } + + @Override + public ClassLoaderService getClassLoaderService() { + return classLoaderService; } @Override @@ -255,6 +244,21 @@ public SqmFunctionRegistry getSqmFunctionRegistry() { return sqmFunctionRegistry; } + @Override + public JpaMetamodel getJpaMetamodel() { + return bindingContext.getJpaMetamodel(); + } + + @Override + public MappingMetamodel getMappingMetamodel() { + return bindingContext.getMappingMetamodel(); + } + + @Override + public Dialect getDialect() { + return dialect; + } + @Override public void close() { if ( namedObjectRepository != null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java index 288445de39e2..c802b219c41f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java @@ -18,6 +18,7 @@ import org.hibernate.query.spi.QueryParameterBinding; import org.hibernate.query.spi.QueryParameterBindingTypeResolver; import org.hibernate.query.spi.QueryParameterBindingValidator; +import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.tree.expression.NullSqmExpressible; import org.hibernate.type.descriptor.java.JavaType; @@ -95,6 +96,10 @@ public QueryParameter getQueryParameter() { return queryParameter; } + private NodeBuilder getCriteriaBuilder() { + return sessionFactory.getQueryEngine().getCriteriaBuilder(); + } + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // single-valued binding support @@ -243,12 +248,12 @@ public void setBindValues( private void setExplicitTemporalPrecision(TemporalType precision) { explicitTemporalPrecision = precision; if ( bindType == null || JavaTypeHelper.isTemporal( determineJavaType( bindType ) ) ) { - bindType = BindingTypeHelper.INSTANCE.resolveTemporalPrecision( precision, bindType, sessionFactory ); + bindType = BindingTypeHelper.INSTANCE.resolveTemporalPrecision( precision, bindType, getCriteriaBuilder() ); } } private JavaType determineJavaType(BindableType bindType) { - final SqmExpressible sqmExpressible = bindType.resolveExpressible( sessionFactory ); + final SqmExpressible sqmExpressible = bindType.resolveExpressible( getCriteriaBuilder() ); assert sqmExpressible != null; return sqmExpressible.getExpressibleJavaType(); } @@ -281,15 +286,15 @@ else if ( type instanceof BasicValuedMapping basicValuedMapping ) { } private void validate(Object value) { - QueryParameterBindingValidator.INSTANCE.validate( getBindType(), value, sessionFactory ); + QueryParameterBindingValidator.INSTANCE.validate( getBindType(), value, getCriteriaBuilder() ); } private void validate(Object value, BindableType clarifiedType) { - QueryParameterBindingValidator.INSTANCE.validate( clarifiedType, value, sessionFactory ); + QueryParameterBindingValidator.INSTANCE.validate( clarifiedType, value, getCriteriaBuilder() ); } private void validate(Object value, TemporalType clarifiedTemporalType) { - QueryParameterBindingValidator.INSTANCE.validate( getBindType(), value, clarifiedTemporalType, sessionFactory ); + QueryParameterBindingValidator.INSTANCE.validate( getBindType(), value, clarifiedTemporalType, getCriteriaBuilder() ); } @Override @@ -332,7 +337,7 @@ private Object coerce(T value, BindableType parameterType) { return null; } else { - final SqmExpressible sqmExpressible = parameterType.resolveExpressible( sessionFactory ); + final SqmExpressible sqmExpressible = parameterType.resolveExpressible( getCriteriaBuilder() ); assert sqmExpressible != null; return sqmExpressible.getExpressibleJavaType().coerce( value, this ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/ResultMementoBasicStandard.java b/hibernate-core/src/main/java/org/hibernate/query/internal/ResultMementoBasicStandard.java index a23405e0c2de..8574f81b3723 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/ResultMementoBasicStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/ResultMementoBasicStandard.java @@ -7,7 +7,6 @@ import java.lang.reflect.ParameterizedType; import java.util.function.Consumer; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.query.named.ResultMementoBasic; import org.hibernate.query.results.ResultBuilderBasicValued; @@ -72,69 +71,69 @@ public ResultMementoBasicStandard( ResultSetMappingResolutionContext context) { this.explicitColumnName = definition.name(); - final SessionFactoryImplementor sessionFactory = context.getSessionFactory(); - final TypeConfiguration typeConfiguration = sessionFactory.getTypeConfiguration(); - final Class definedType = definition.type(); - if ( void.class == definedType ) { builder = new CompleteResultBuilderBasicValuedStandard( explicitColumnName, null, null ); } - else if ( AttributeConverter.class.isAssignableFrom( definedType ) ) { - @SuppressWarnings("unchecked") - final Class> converterClass = - (Class>) definedType; - final ManagedBean> converterBean = - sessionFactory.getManagedBeanRegistry().getBean( converterClass ); - final JavaType> converterJtd = - typeConfiguration.getJavaTypeRegistry().getDescriptor( converterClass ); - - final ParameterizedType parameterizedType = - extractAttributeConverterParameterizedType( converterBean.getBeanClass() ); - - builder = new CompleteResultBuilderBasicValuedConverted( - explicitColumnName, - converterBean, - converterJtd, - determineDomainJavaType( parameterizedType, typeConfiguration.getJavaTypeRegistry() ), - resolveUnderlyingMapping( parameterizedType, typeConfiguration ) - ); - } else { - final BasicType explicitType; - final JavaType explicitJavaType; - - // see if this is a registered BasicType... - final BasicType registeredBasicType = - typeConfiguration.getBasicTypeRegistry().getRegisteredType( definedType.getName() ); - if ( registeredBasicType != null ) { - explicitType = registeredBasicType; - explicitJavaType = registeredBasicType.getJavaTypeDescriptor(); + final TypeConfiguration typeConfiguration = context.getTypeConfiguration(); + final ManagedBeanRegistry managedBeanRegistry = context.getSessionFactory().getManagedBeanRegistry(); + + if ( AttributeConverter.class.isAssignableFrom( definedType ) ) { + @SuppressWarnings("unchecked") + final Class> converterClass = + (Class>) definedType; + final ManagedBean> converterBean = + managedBeanRegistry.getBean( converterClass ); + final JavaType> converterJtd = + typeConfiguration.getJavaTypeRegistry().getDescriptor( converterClass ); + + final ParameterizedType parameterizedType = + extractAttributeConverterParameterizedType( converterBean.getBeanClass() ); + + builder = new CompleteResultBuilderBasicValuedConverted( + explicitColumnName, + converterBean, + converterJtd, + determineDomainJavaType( parameterizedType, typeConfiguration.getJavaTypeRegistry() ), + resolveUnderlyingMapping( parameterizedType, typeConfiguration ) + ); } else { - final JavaTypeRegistry jtdRegistry = typeConfiguration.getJavaTypeRegistry(); - final JavaType registeredJtd = jtdRegistry.getDescriptor( definedType ); - final ManagedBeanRegistry beanRegistry = sessionFactory.getManagedBeanRegistry(); - if ( BasicType.class.isAssignableFrom( registeredJtd.getJavaTypeClass() ) ) { - final ManagedBean> typeBean = - (ManagedBean) beanRegistry.getBean( registeredJtd.getJavaTypeClass() ); - explicitType = typeBean.getBeanInstance(); - explicitJavaType = explicitType.getJavaTypeDescriptor(); - } - else if ( UserType.class.isAssignableFrom( registeredJtd.getJavaTypeClass() ) ) { - final ManagedBean> userTypeBean = - (ManagedBean) beanRegistry.getBean( registeredJtd.getJavaTypeClass() ); - // todo (6.0) : is this the best approach? or should we keep a Class -> @Type mapping somewhere? - explicitType = new CustomType<>( userTypeBean.getBeanInstance(), typeConfiguration ); - explicitJavaType = explicitType.getJavaTypeDescriptor(); + final BasicType explicitType; + final JavaType explicitJavaType; + + // see if this is a registered BasicType... + final BasicType registeredBasicType = + typeConfiguration.getBasicTypeRegistry().getRegisteredType( definedType.getName() ); + if ( registeredBasicType != null ) { + explicitType = registeredBasicType; + explicitJavaType = registeredBasicType.getJavaTypeDescriptor(); } else { - explicitType = null; - explicitJavaType = jtdRegistry.getDescriptor( definedType ); + final JavaTypeRegistry jtdRegistry = typeConfiguration.getJavaTypeRegistry(); + final JavaType registeredJtd = jtdRegistry.getDescriptor( definedType ); + if ( BasicType.class.isAssignableFrom( registeredJtd.getJavaTypeClass() ) ) { + final ManagedBean> typeBean = + (ManagedBean) managedBeanRegistry.getBean( registeredJtd.getJavaTypeClass() ); + explicitType = typeBean.getBeanInstance(); + explicitJavaType = explicitType.getJavaTypeDescriptor(); + } + else if ( UserType.class.isAssignableFrom( registeredJtd.getJavaTypeClass() ) ) { + final ManagedBean> userTypeBean = + (ManagedBean) managedBeanRegistry.getBean( registeredJtd.getJavaTypeClass() ); + // todo (6.0) : is this the best approach? or should we keep a Class -> @Type mapping somewhere? + explicitType = new CustomType<>( userTypeBean.getBeanInstance(), typeConfiguration ); + explicitJavaType = explicitType.getJavaTypeDescriptor(); + } + else { + explicitType = null; + explicitJavaType = jtdRegistry.getDescriptor( definedType ); + } } - } - builder = new CompleteResultBuilderBasicValuedStandard( explicitColumnName, explicitType, explicitJavaType ); + builder = new CompleteResultBuilderBasicValuedStandard( explicitColumnName, explicitType, explicitJavaType ); + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/ResultSetMappingResolutionContext.java b/hibernate-core/src/main/java/org/hibernate/query/internal/ResultSetMappingResolutionContext.java index ed32de761407..2f6f0f75abe3 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/ResultSetMappingResolutionContext.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/ResultSetMappingResolutionContext.java @@ -5,6 +5,9 @@ package org.hibernate.query.internal; import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.metamodel.MappingMetamodel; +import org.hibernate.query.named.NamedObjectRepository; +import org.hibernate.type.spi.TypeConfiguration; /** * Context ("parameter object") used in resolving a {@link NamedResultSetMappingMementoImpl} @@ -14,4 +17,16 @@ @FunctionalInterface public interface ResultSetMappingResolutionContext { SessionFactoryImplementor getSessionFactory(); + + default MappingMetamodel getMappingMetamodel() { + return getSessionFactory().getMappingMetamodel(); + } + + default TypeConfiguration getTypeConfiguration() { + return getSessionFactory().getTypeConfiguration(); + } + + default NamedObjectRepository getNamedObjectRepository() { + return getSessionFactory().getQueryEngine().getNamedObjectRepository(); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/Builders.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/Builders.java index 78e080ecfc58..4eabf9ef4dfd 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/Builders.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/Builders.java @@ -10,6 +10,7 @@ import org.hibernate.LockMode; import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.RuntimeMetamodels; import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.BasicValuedModelPart; @@ -19,7 +20,6 @@ import org.hibernate.metamodel.mapping.internal.DiscriminatedAssociationAttributeMapping; import org.hibernate.metamodel.mapping.internal.EntityCollectionPart; import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping; -import org.hibernate.metamodel.spi.MappingMetamodelImplementor; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.NativeQuery; import org.hibernate.query.internal.ResultSetMappingResolutionContext; @@ -246,15 +246,12 @@ public static DynamicFetchBuilderLegacy fetch(String tableAlias, String ownerTab public static ResultBuilder resultClassBuilder( Class resultMappingClass, ResultSetMappingResolutionContext resolutionContext) { - return resultClassBuilder( resultMappingClass, resolutionContext.getSessionFactory() ); + return resultClassBuilder( resultMappingClass, resolutionContext.getMappingMetamodel() ); } public static ResultBuilder resultClassBuilder( Class resultMappingClass, - SessionFactoryImplementor sessionFactory) { - final MappingMetamodelImplementor mappingMetamodel = - sessionFactory.getRuntimeMetamodels() - .getMappingMetamodel(); + MappingMetamodel mappingMetamodel) { final EntityMappingType entityMappingType = mappingMetamodel.findEntityDescriptor( resultMappingClass ); if ( entityMappingType != null ) { // the resultClass is an entity diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/DomainResultCreationStateImpl.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/DomainResultCreationStateImpl.java index e7e5f7d8b68b..a242c64ead06 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/DomainResultCreationStateImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/DomainResultCreationStateImpl.java @@ -77,7 +77,7 @@ public class DomainResultCreationStateImpl private final LegacyFetchResolver legacyFetchResolver; private final SessionFactoryImplementor sessionFactory; - private final Stack fetchBuilderResolverStack = new StandardStack<>( fetchableName -> null ); + private final Stack> fetchBuilderResolverStack = new StandardStack<>( fetchableName -> null ); private Map registeredLockModes; private boolean processingKeyFetches = false; private boolean resolvingCircularFetch; @@ -210,7 +210,7 @@ public DomainResultCreationStateImpl getCurrentProcessingState() { } public SqlAstCreationContext getCreationContext() { - return getSessionFactory(); + return sessionFactory.getSqlTranslationEngine(); } @Override @@ -433,9 +433,9 @@ private Consumer createFetchableConsumer(FetchParent fetchParent, Imm final ForeignKeyDescriptor foreignKeyDescriptor = association.getForeignKeyDescriptor(); // If there are no fetch builders for this association, we only want to fetch the FK if ( explicitFetchBuilder == null && fetchBuilderLegacy == null ) { - explicitFetchBuilder = (FetchBuilder) fetchBuilderResolverStack - .getCurrent() - .apply( foreignKeyDescriptor.getSide( association.getSideNature().inverse() ).getModelPart() ); + Fetchable modelPart = (Fetchable) + foreignKeyDescriptor.getSide( association.getSideNature().inverse() ).getModelPart(); + explicitFetchBuilder = fetchBuilderResolverStack.getCurrent().apply( modelPart ); if ( explicitFetchBuilder == null ) { fetchBuilderLegacy = legacyFetchResolver.resolve( fromClauseAccess.findTableGroup( fetchParent.getNavigablePath() ) diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/ResultSetMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/ResultSetMappingImpl.java index 2ba16bc412d6..2fc1b09d4448 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/ResultSetMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/ResultSetMappingImpl.java @@ -308,7 +308,9 @@ private DomainResult makeImplicitDomainResult( JdbcValuesMetadata jdbcResultsMetadata, SessionFactoryImplementor sessionFactory) { final int jdbcPosition = valuesArrayPosition + 1; - final BasicType jdbcMapping = jdbcResultsMetadata.resolveType( jdbcPosition, null, sessionFactory ); + final BasicType jdbcMapping = + jdbcResultsMetadata.resolveType( jdbcPosition, null, + sessionFactory.getTypeConfiguration() ); final String name = jdbcResultsMetadata.resolveColumnName( jdbcPosition ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedStandard.java index b9e5525c7994..a14dae649eb1 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/complete/CompleteResultBuilderBasicValuedStandard.java @@ -4,7 +4,6 @@ */ package org.hibernate.query.results.internal.complete; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.query.results.ResultBuilder; import org.hibernate.query.results.internal.DomainResultCreationStateImpl; @@ -16,6 +15,7 @@ import org.hibernate.sql.results.graph.basic.BasicResult; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata; import org.hibernate.type.descriptor.java.JavaType; +import org.hibernate.type.spi.TypeConfiguration; import java.util.Objects; @@ -90,7 +90,7 @@ private SqlSelection sqlSelection( JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationStateImpl creationStateImpl, String columnName, int jdbcPosition) { - final SessionFactoryImplementor sessionFactory = creationStateImpl.getSessionFactory(); + final TypeConfiguration typeConfiguration = creationStateImpl.getCreationContext().getTypeConfiguration(); return creationStateImpl.resolveSqlSelection( creationStateImpl.resolveSqlExpression( SqlExpressionResolver.createColumnReferenceKey( columnName ), @@ -103,7 +103,7 @@ private SqlSelection sqlSelection( basicType = jdbcResultsMetadata.resolveType( jdbcPosition, explicitJavaType, - sessionFactory + typeConfiguration ); } final int valuesArrayPosition = ResultsHelper.jdbcPositionToValuesArrayPosition( jdbcPosition ); @@ -112,7 +112,7 @@ private SqlSelection sqlSelection( ), explicitJavaType, null, - sessionFactory.getTypeConfiguration() + typeConfiguration ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderLegacy.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderLegacy.java index f2d74316ce0f..246353e72408 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderLegacy.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderLegacy.java @@ -316,8 +316,7 @@ private void resolveSqlSelection( ), selectableMapping.getJdbcMapping().getJdbcJavaType(), null, - domainResultCreationState.getSqlAstCreationState().getCreationContext() - .getSessionFactory().getTypeConfiguration() + domainResultCreationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderStandard.java index fb85889d411f..5397667762ce 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicFetchBuilderStandard.java @@ -193,8 +193,7 @@ private SelectableConsumer getSelectableConsumer( ), selectableMapping.getJdbcMapping().getJdbcJavaType(), null, - domainResultCreationState.getSqlAstCreationState().getCreationContext() - .getSessionFactory().getTypeConfiguration() + domainResultCreationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); }; } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderAttribute.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderAttribute.java index 4d00ec6a6be9..7475a3e4e68a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderAttribute.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderAttribute.java @@ -103,8 +103,7 @@ private SqlSelection sqlSelection( ), attributeMapping.getJdbcMapping().getJdbcJavaType(), null, - domainResultCreationState.getSqlAstCreationState().getCreationContext() - .getSessionFactory().getTypeConfiguration() + domainResultCreationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicConverted.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicConverted.java index ccb4a24bbce2..e815db0d2d50 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicConverted.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicConverted.java @@ -21,6 +21,7 @@ import org.hibernate.type.descriptor.converter.internal.JpaAttributeConverterImpl; import org.hibernate.type.descriptor.converter.spi.BasicValueConverter; import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry; +import org.hibernate.type.spi.TypeConfiguration; import java.util.Objects; @@ -82,7 +83,7 @@ public BasicResult buildResult( int resultPosition, DomainResultCreationState domainResultCreationState) { final SqlAstCreationState sqlAstCreationState = domainResultCreationState.getSqlAstCreationState(); - final SessionFactoryImplementor sessionFactory = sqlAstCreationState.getCreationContext().getSessionFactory(); + final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); final String columnName = @@ -92,12 +93,11 @@ public BasicResult buildResult( final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlExpression( SqlExpressionResolver.createColumnReferenceKey( columnName ), - state -> - resultSetMappingSqlSelection( jdbcResultsMetadata, resultPosition, sessionFactory ) + state -> resultSetMappingSqlSelection( jdbcResultsMetadata, resultPosition, typeConfiguration ) ), basicValueConverter.getRelationalJavaType(), null, - sessionFactory.getTypeConfiguration() + typeConfiguration ); return new BasicResult<>( @@ -112,7 +112,7 @@ public BasicResult buildResult( } private ResultSetMappingSqlSelection resultSetMappingSqlSelection( - JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, SessionFactoryImplementor sessionFactory) { + JdbcValuesMetadata jdbcResultsMetadata, int resultPosition, TypeConfiguration typeConfiguration) { final int jdbcPosition = columnAlias != null ? jdbcResultsMetadata.resolveColumnPosition( columnAlias ) @@ -120,7 +120,7 @@ private ResultSetMappingSqlSelection resultSetMappingSqlSelection( final BasicType basicType = jdbcResultsMetadata.resolveType( jdbcPosition, basicValueConverter.getRelationalJavaType(), - sessionFactory + typeConfiguration ); final int valuesArrayPosition = ResultsHelper.jdbcPositionToValuesArrayPosition( jdbcPosition ); return new ResultSetMappingSqlSelection( valuesArrayPosition, (BasicValuedMapping) basicType ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicStandard.java index d00963ebeef3..f7438f74bbfd 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderBasicStandard.java @@ -4,7 +4,6 @@ */ package org.hibernate.query.results.internal.dynamic; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.query.NativeQuery; @@ -20,6 +19,7 @@ import org.hibernate.type.BasicType; import org.hibernate.type.descriptor.converter.spi.BasicValueConverter; import org.hibernate.type.descriptor.java.JavaType; +import org.hibernate.type.spi.TypeConfiguration; import java.util.Objects; @@ -120,12 +120,12 @@ public BasicResult buildResult( int resultPosition, DomainResultCreationState domainResultCreationState) { final SqlAstCreationState sqlAstCreationState = domainResultCreationState.getSqlAstCreationState(); - final SessionFactoryImplementor sessionFactory = sqlAstCreationState.getCreationContext().getSessionFactory(); + final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); final Expression expression = sqlExpressionResolver.resolveSqlExpression( SqlExpressionResolver.createColumnReferenceKey( columnName ), - state -> resultSetMappingSqlSelection( jdbcResultsMetadata, sessionFactory ) + state -> resultSetMappingSqlSelection( jdbcResultsMetadata, typeConfiguration ) ); final JavaType javaType; @@ -146,7 +146,7 @@ public BasicResult buildResult( expression, jdbcJavaType, null, - sessionFactory.getTypeConfiguration() + typeConfiguration ); // StandardRowReader expects there to be a JavaType as part of the ResultAssembler. @@ -164,7 +164,7 @@ public BasicResult buildResult( } private ResultSetMappingSqlSelection resultSetMappingSqlSelection( - JdbcValuesMetadata jdbcResultsMetadata, SessionFactoryImplementor sessionFactory) { + JdbcValuesMetadata jdbcResultsMetadata, TypeConfiguration typeConfiguration) { final int jdbcPosition = columnPosition > 0 ? columnPosition @@ -173,7 +173,7 @@ private ResultSetMappingSqlSelection resultSetMappingSqlSelection( final BasicType basicType = explicitType != null ? explicitType - : jdbcResultsMetadata.resolveType( jdbcPosition, explicitJavaType, sessionFactory ); + : jdbcResultsMetadata.resolveType( jdbcPosition, explicitJavaType, typeConfiguration ); return new ResultSetMappingSqlSelection( valuesArrayPosition, (BasicValuedMapping) basicType ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityStandard.java index 02a044a88184..110074da7266 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityStandard.java @@ -297,9 +297,7 @@ private static void resolveDiscriminatorSqlSelection(String columnAlias, TableRe ), discriminatorMapping.getJdbcMapping().getJdbcJavaType(), null, - domainResultCreationState.getSqlAstCreationState() - .getCreationContext() - .getSessionFactory() + domainResultCreationState.getSqlAstCreationState().getCreationContext() .getTypeConfiguration() ); } @@ -325,9 +323,7 @@ private void resolveSqlSelection( ), selectableMapping.getJdbcMapping().getJdbcJavaType(), null, - domainResultCreationState.getSqlAstCreationState() - .getCreationContext() - .getSessionFactory() + domainResultCreationState.getSqlAstCreationState().getCreationContext() .getTypeConfiguration() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderBasic.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderBasic.java index 331d8463c586..fb130cb1244f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderBasic.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitFetchBuilderBasic.java @@ -103,7 +103,7 @@ private SqlSelection sqlSelection( fetchable.getJdbcMapping().getJdbcJavaType(), parent, domainResultCreationState.getSqlAstCreationState().getCreationContext() - .getSessionFactory().getTypeConfiguration() + .getTypeConfiguration() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitResultClassBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitResultClassBuilder.java index 584feef189a1..d157e87fffe2 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitResultClassBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/internal/implicit/ImplicitResultClassBuilder.java @@ -5,7 +5,6 @@ package org.hibernate.query.results.internal.implicit; import jakarta.persistence.NamedNativeQuery; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.BasicValuedMapping; import org.hibernate.query.results.ResultBuilder; import org.hibernate.query.results.internal.ResultSetMappingSqlSelection; @@ -40,8 +39,7 @@ public DomainResult buildResult( assert resultPosition == 0; final SqlAstCreationState sqlAstCreationState = domainResultCreationState.getSqlAstCreationState(); - final SessionFactoryImplementor sessionFactory = sqlAstCreationState.getCreationContext().getSessionFactory(); - final TypeConfiguration typeConfiguration = sessionFactory.getTypeConfiguration(); + final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); final int jdbcResultPosition = 1; diff --git a/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java b/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java index f5a57377d274..e8e78f0a2a72 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java +++ b/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java @@ -767,7 +767,8 @@ public CommonQueryContract setParameter(String name, Object value) { private boolean isInstance(BindableType parameterType, Object value) { - final SqmExpressible sqmExpressible = parameterType.resolveExpressible( getSession().getFactory() ); + final SqmExpressible sqmExpressible = + parameterType.resolveExpressible( getSession().getFactory().getQueryEngine().getCriteriaBuilder() ); assert sqmExpressible != null; return sqmExpressible.getExpressibleJavaType().isInstance( value ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/spi/QueryEngine.java b/hibernate-core/src/main/java/org/hibernate/query/spi/QueryEngine.java index 6a83b1241571..29f636bd3113 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/spi/QueryEngine.java +++ b/hibernate-core/src/main/java/org/hibernate/query/spi/QueryEngine.java @@ -5,13 +5,16 @@ package org.hibernate.query.spi; import org.hibernate.Incubating; +import org.hibernate.Internal; +import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; +import org.hibernate.dialect.Dialect; import org.hibernate.engine.query.spi.NativeQueryInterpreter; +import org.hibernate.query.BindingContext; import org.hibernate.query.hql.HqlTranslator; import org.hibernate.query.named.NamedObjectRepository; import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.function.SqmFunctionRegistry; import org.hibernate.query.sqm.sql.SqmTranslatorFactory; -import org.hibernate.type.spi.TypeConfiguration; /** * Aggregation and encapsulation of the components Hibernate uses @@ -21,7 +24,7 @@ * @author Gavin King */ @Incubating -public interface QueryEngine { +public interface QueryEngine extends BindingContext { /** * The default soft reference count. @@ -34,10 +37,10 @@ public interface QueryEngine { SqmFunctionRegistry getSqmFunctionRegistry(); - TypeConfiguration getTypeConfiguration(); - NodeBuilder getCriteriaBuilder(); + Dialect getDialect(); + void close(); void validateNamedQueries(); @@ -48,6 +51,12 @@ public interface QueryEngine { SqmTranslatorFactory getSqmTranslatorFactory(); + /** + * Avoid use of this, because Hibernate Processor can't do class loading + */ + @Internal + ClassLoaderService getClassLoaderService(); + default HqlInterpretation interpretHql(String hql, Class resultType) { return getInterpretationCache().resolveHqlInterpretation( hql, resultType, getHqlTranslator() ); } 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 d4c4698541da..68781e1d2379 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 @@ -30,7 +30,6 @@ import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.metamodel.mapping.internal.EmbeddedAttributeMapping; -import org.hibernate.metamodel.spi.MappingMetamodelImplementor; import org.hibernate.query.QueryFlushMode; import org.hibernate.HibernateException; import org.hibernate.LockMode; @@ -120,7 +119,6 @@ import org.hibernate.type.BasicTypeRegistry; import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.spi.UnknownBasicJavaType; -import org.hibernate.type.spi.TypeConfiguration; import static java.lang.Character.isWhitespace; import static java.util.Collections.addAll; @@ -194,6 +192,10 @@ private static NamedObjectRepository getNamedObjectRepository(SharedSessionContr return session.getFactory().getQueryEngine().getNamedObjectRepository(); } + private static QueryInterpretationCache getInterpretationCache(SharedSessionContractImplementor session) { + return session.getFactory().getQueryEngine().getInterpretationCache(); + } + private static String getResultSetMappingName(NamedNativeQueryMemento memento) { if ( memento.getResultMappingName() != null ) { return memento.getResultMappingName(); @@ -421,7 +423,7 @@ public List getParameterOccurrences() { private ParameterInterpretation resolveParameterInterpretation( String sqlString, SharedSessionContractImplementor session) { - return session.getFactory().getQueryEngine().getInterpretationCache() + return getInterpretationCache( session ) .resolveNativeQueryParameters( sqlString, s -> parameterInterpretation( sqlString, session ) ); } @@ -709,7 +711,7 @@ protected SelectQueryPlan resolveSelectQueryPlan() { } else if ( !isResultTypeAlwaysAllowed( resultType ) && (!isClass( resultType ) || hasJavaTypeDescriptor( resultType )) ) { - mapping.addResultBuilder( Builders.resultClassBuilder( resultType, getSessionFactory() ) ); + mapping.addResultBuilder( Builders.resultClassBuilder( resultType, getSessionFactory().getMappingMetamodel() ) ); } } else { @@ -790,10 +792,6 @@ public Set getAffectedTableNames() { return getNativeQueryInterpreter().createQueryPlan( queryDefinition, getSessionFactory() ); } - private TypeConfiguration getTypeConfiguration() { - return getSessionFactory().getTypeConfiguration(); - } - private NativeQueryInterpreter getNativeQueryInterpreter() { return getSessionFactory().getQueryEngine().getNativeQueryInterpreter(); } @@ -966,7 +964,7 @@ private BasicTypeRegistry getBasicTypeRegistry() { } private QueryInterpretationCache getInterpretationCache() { - return getSession().getFactory().getQueryEngine().getInterpretationCache(); + return getInterpretationCache( getSession() ); } private NonSelectQueryPlan resolveNonSelectQueryPlan() { @@ -998,7 +996,7 @@ protected NonSelectInterpretationsKey generateNonSelectInterpretationsKey() { @Override public void addResultTypeClass(Class resultClass) { assert resultSetMapping.getNumberOfResultBuilders() == 0; - registerBuilder( Builders.resultClassBuilder( resultClass, getSessionFactory() ) ); + registerBuilder( Builders.resultClassBuilder( resultClass, getSessionFactory().getMappingMetamodel() ) ); } @Override @@ -1238,10 +1236,6 @@ protected void addQuerySpaces(Serializable... spaces) { } } - private MappingMetamodelImplementor getMappingMetamodel() { - return getSession().getFactory().getRuntimeMetamodels().getMappingMetamodel(); - } - @Override public NativeQueryImplementor addSynchronizedEntityName(String entityName) { addQuerySpaces( getMappingMetamodel().getEntityDescriptor( entityName ).getQuerySpaces() ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sql/internal/SqlTranslationEngineImpl.java b/hibernate-core/src/main/java/org/hibernate/query/sql/internal/SqlTranslationEngineImpl.java new file mode 100644 index 000000000000..3ca586643d31 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/query/sql/internal/SqlTranslationEngineImpl.java @@ -0,0 +1,80 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.query.sql.internal; + +import org.hibernate.engine.profile.FetchProfile; +import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.metamodel.model.domain.JpaMetamodel; +import org.hibernate.metamodel.spi.MappingMetamodelImplementor; +import org.hibernate.query.sql.spi.SqlTranslationEngine; +import org.hibernate.type.spi.TypeConfiguration; + +import java.util.Map; +import java.util.Set; + +import static java.util.Collections.unmodifiableSet; + +public class SqlTranslationEngineImpl implements SqlTranslationEngine { + + //TODO: consider unifying with SqlStringGenerationContextImpl + + private final SessionFactoryImplementor factory; + private final TypeConfiguration typeConfiguration; + private final Map fetchProfiles; + + public SqlTranslationEngineImpl( + SessionFactoryImplementor factory, + TypeConfiguration typeConfiguration, + Map fetchProfiles) { + this.factory = factory; + this.typeConfiguration = typeConfiguration; + this.fetchProfiles = fetchProfiles; + } + + @Override + public TypeConfiguration getTypeConfiguration() { + return typeConfiguration; + } + + @Override + public SessionFactoryImplementor getSessionFactory() { + return factory; + } + + @Override + public MappingMetamodelImplementor getMappingMetamodel() { + return factory.getMappingMetamodel(); + } + + @Override + public Integer getMaximumFetchDepth() { + return factory.getSessionFactoryOptions().getMaximumFetchDepth(); + } + + @Override + public boolean isJpaQueryComplianceEnabled() { + return factory.getSessionFactoryOptions().getJpaCompliance().isJpaQueryComplianceEnabled(); + } + + @Override + public JpaMetamodel getJpaMetamodel() { + return factory.getJpaMetamodel(); + } + + @Override + public FetchProfile getFetchProfile(String name) { + return fetchProfiles.get( name ); + } + + @Override + public boolean containsFetchProfileDefinition(String name) { + return fetchProfiles.containsKey( name ); + } + + @Override + public Set getDefinedFetchProfileNames() { + return unmodifiableSet( fetchProfiles.keySet() ); + } +} diff --git a/hibernate-core/src/main/java/org/hibernate/query/sql/spi/SqlTranslationEngine.java b/hibernate-core/src/main/java/org/hibernate/query/sql/spi/SqlTranslationEngine.java new file mode 100644 index 000000000000..536e6ec3877b --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/query/sql/spi/SqlTranslationEngine.java @@ -0,0 +1,28 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.query.sql.spi; + +import org.hibernate.Incubating; +import org.hibernate.sql.ast.spi.SqlAstCreationContext; + +import java.util.Set; + +/** + * Introduced as an analog of {@link org.hibernate.query.spi.QueryEngine} + * and/or {@link org.hibernate.query.sqm.NodeBuilder} for the SQL + * translation and rendering phases. For now there is nothing here. + * + * @since 7.0 + * + * @author Gavin King + */ +@Incubating +public interface SqlTranslationEngine extends SqlAstCreationContext { + // TODO: consider implementing SqlStringGenerationContext + + boolean containsFetchProfileDefinition(String name); + + Set getDefinedFetchProfileNames(); +} diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java index 5eba6bf61c78..d7517402a54c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java @@ -21,7 +21,6 @@ import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.query.ImmutableEntityUpdateQueryHandlingMode; import org.hibernate.query.NullPrecedence; -import org.hibernate.query.BindingContext; import org.hibernate.query.SortDirection; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.criteria.JpaCastTarget; @@ -35,7 +34,7 @@ import org.hibernate.query.criteria.JpaSelection; import org.hibernate.query.criteria.JpaSimpleCase; import org.hibernate.query.criteria.JpaWindow; -import org.hibernate.query.spi.QueryEngine; +import org.hibernate.query.sqm.spi.SqmCreationContext; import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement; import org.hibernate.query.sqm.tree.domain.SqmBagJoin; import org.hibernate.query.sqm.tree.domain.SqmListJoin; @@ -66,7 +65,6 @@ import org.hibernate.query.sqm.tree.select.SqmSubQuery; import org.hibernate.query.sqm.tree.update.SqmUpdateStatement; import org.hibernate.type.BasicType; -import org.hibernate.type.spi.TypeConfiguration; import jakarta.persistence.Tuple; import jakarta.persistence.criteria.CollectionJoin; @@ -88,14 +86,19 @@ * @author Steve Ebersole */ @SuppressWarnings("unchecked") -public interface NodeBuilder extends HibernateCriteriaBuilder, BindingContext { - JpaMetamodel getDomainModel(); - - TypeConfiguration getTypeConfiguration(); +public interface NodeBuilder extends HibernateCriteriaBuilder, SqmCreationContext { + default JpaMetamodel getDomainModel() { + return getJpaMetamodel(); + } - boolean isJpaQueryComplianceEnabled(); + default boolean isJpaQueryComplianceEnabled() { + return getJpaCompliance().isJpaQueryComplianceEnabled(); + } - QueryEngine getQueryEngine(); + @Override + default NodeBuilder getNodeBuilder() { + return this; + } SqmTuple tuple( Class tupleType, diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/function/AbstractSqmFunctionDescriptor.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/function/AbstractSqmFunctionDescriptor.java index 50d8afc949c6..1725873836e7 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/function/AbstractSqmFunctionDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/function/AbstractSqmFunctionDescriptor.java @@ -98,7 +98,7 @@ public final SelfRenderingSqmFunction generateSqmExpression( List> arguments, ReturnableType impliedResultType, QueryEngine queryEngine) { - argumentsValidator.validate( arguments, getName(), queryEngine.getTypeConfiguration() ); + argumentsValidator.validate( arguments, getName(), queryEngine ); return generateSqmFunctionExpression( arguments, @@ -113,7 +113,7 @@ public final SelfRenderingSqmFunction generateAggregateSqmExpression( SqmPredicate filter, ReturnableType impliedResultType, QueryEngine queryEngine) { - argumentsValidator.validate( arguments, getName(), queryEngine.getTypeConfiguration() ); + argumentsValidator.validate( arguments, getName(), queryEngine ); return generateSqmAggregateFunctionExpression( arguments, @@ -130,7 +130,7 @@ public final SelfRenderingSqmFunction generateOrderedSetAggregateSqmExpre SqmOrderByClause withinGroupClause, ReturnableType impliedResultType, QueryEngine queryEngine) { - argumentsValidator.validate( arguments, getName(), queryEngine.getTypeConfiguration() ); + argumentsValidator.validate( arguments, getName(), queryEngine ); return generateSqmOrderedSetAggregateFunctionExpression( arguments, @@ -149,7 +149,7 @@ public final SelfRenderingSqmFunction generateWindowSqmExpression( Boolean fromFirst, ReturnableType impliedResultType, QueryEngine queryEngine) { - argumentsValidator.validate( arguments, getName(), queryEngine.getTypeConfiguration() ); + argumentsValidator.validate( arguments, getName(), queryEngine ); return generateSqmWindowFunctionExpression( arguments, diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/function/AbstractSqmSetReturningFunctionDescriptor.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/function/AbstractSqmSetReturningFunctionDescriptor.java index 31a7f681aaef..4b2b23783750 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/function/AbstractSqmSetReturningFunctionDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/function/AbstractSqmSetReturningFunctionDescriptor.java @@ -82,7 +82,7 @@ public String getArgumentListSignature() { public final SelfRenderingSqmSetReturningFunction generateSqmExpression( List> arguments, QueryEngine queryEngine) { - argumentsValidator.validate( arguments, getName(), queryEngine.getTypeConfiguration() ); + argumentsValidator.validate( arguments, getName(), queryEngine ); return generateSqmSetReturningFunctionExpression( arguments, queryEngine ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmFunction.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmFunction.java index 0c7bbaeb3500..f688b89e0547 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmFunction.java @@ -201,10 +201,8 @@ protected MappingModelExpressible getMappingModelExpressible( mapping = returnTypeResolver.resolveFunctionReturnType( () -> { try { - final MappingMetamodelImplementor domainModel = walker.getCreationContext() - .getSessionFactory() - .getRuntimeMetamodels() - .getMappingMetamodel(); + final MappingMetamodelImplementor domainModel = + walker.getCreationContext().getMappingMetamodel(); return (BasicValuedMapping) domainModel.resolveMappingExpressible( getNodeType(), walker.getFromClauseAccess()::getTableGroup diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmSetReturningFunction.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmSetReturningFunction.java index 099a28364854..b93c7f1d6fb2 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmSetReturningFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmSetReturningFunction.java @@ -225,7 +225,8 @@ public TableGroup convertToSqlAst( tableGroupProducer.getCompatibleTableExpressions(), lateral, canUseInnerJoins, - getFunctionRenderer().rendersIdentifierVariable( arguments, walker.getCreationContext().getSessionFactory() ), + getFunctionRenderer() + .rendersIdentifierVariable( arguments, walker.getCreationContext().getSessionFactory() ), walker.getCreationContext().getSessionFactory() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java index 1a0b56b35cae..9288385d9829 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java @@ -479,7 +479,7 @@ private static CacheableSqmInterpretation buildCacheableSqmInterpretation( domainParameterXref, executionContext.getQueryParameterBindings(), executionContext.getSession().getLoadQueryInfluencers(), - sessionFactory, + sessionFactory.getSqlTranslationEngine(), true ) .translate(); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleDeleteQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleDeleteQueryPlan.java index 126158e3b358..cca3e963975c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleDeleteQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleDeleteQueryPlan.java @@ -194,14 +194,15 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter createTranslator(DomainQueryExecutionContext executionContext) { final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); - final SqmTranslator translator = factory.getQueryEngine().getSqmTranslatorFactory().createMutationTranslator( - sqmDelete, - executionContext.getQueryOptions(), - domainParameterXref, - executionContext.getQueryParameterBindings(), - executionContext.getSession().getLoadQueryInfluencers(), - factory - ); + final SqmTranslator translator = + factory.getQueryEngine().getSqmTranslatorFactory().createMutationTranslator( + sqmDelete, + executionContext.getQueryOptions(), + domainParameterXref, + executionContext.getQueryParameterBindings(), + executionContext.getSession().getLoadQueryInfluencers(), + factory.getSqlTranslationEngine() + ); //noinspection unchecked sqmInterpretation = (SqmTranslation) translator.translate(); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleInsertQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleInsertQueryPlan.java index 74a127540f12..06198789230a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleInsertQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleInsertQueryPlan.java @@ -46,14 +46,15 @@ public SimpleInsertQueryPlan( private SqlAstTranslator createInsertTranslator(DomainQueryExecutionContext executionContext) { final SessionFactoryImplementor factory = executionContext.getSession().getFactory(); - final SqmTranslation sqmInterpretation = factory.getQueryEngine().getSqmTranslatorFactory() - .createMutationTranslator( + final SqmTranslation sqmInterpretation = + factory.getQueryEngine().getSqmTranslatorFactory() + .createMutationTranslator( sqmInsert, executionContext.getQueryOptions(), domainParameterXref, executionContext.getQueryParameterBindings(), executionContext.getSession().getLoadQueryInfluencers(), - factory + factory.getSqlTranslationEngine() ) .translate(); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleUpdateQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleUpdateQueryPlan.java index 94b703343bc7..b2f8b0e7edab 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleUpdateQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SimpleUpdateQueryPlan.java @@ -101,7 +101,7 @@ private SqlAstTranslator createUpdateTrans domainParameterXref, executionContext.getQueryParameterBindings(), executionContext.getSession().getLoadQueryInfluencers(), - factory + factory.getSqlTranslationEngine() ) .translate(); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java index 6eea28b818e2..f82be924e18f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java @@ -210,12 +210,16 @@ public SqmCriteriaNodeBuilder( this.criteriaValueHandlingMode = options.getCriteriaValueHandlingMode(); this.immutableEntityUpdateQueryHandlingMode = options.getImmutableEntityUpdateQueryHandlingMode(); this.bindingContext = bindingContext; + this.extensions = loadExtensions(); + } + + private Map, HibernateCriteriaBuilder> loadExtensions() { // load registered criteria builder extensions - this.extensions = new HashMap<>(); + final Map, HibernateCriteriaBuilder> extensions = new HashMap<>(); for ( CriteriaBuilderExtension extension : ServiceLoader.load( CriteriaBuilderExtension.class ) ) { - HibernateCriteriaBuilder builder = extension.extend( this ); - extensions.put( extension.getRegistrationKey(), builder ); + extensions.put( extension.getRegistrationKey(), extension.extend( this ) ); } + return extensions; } @Override @@ -225,7 +229,7 @@ public JpaMetamodel getDomainModel() { @Override public TypeConfiguration getTypeConfiguration() { - return getQueryEngine().getTypeConfiguration(); + return bindingContext.getTypeConfiguration(); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmMappingModelHelper.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmMappingModelHelper.java index 9487dd141351..92a2c43b0352 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmMappingModelHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmMappingModelHelper.java @@ -6,7 +6,6 @@ import java.util.function.Function; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.mapping.CollectionPart; import org.hibernate.metamodel.mapping.EntityMappingType; @@ -59,11 +58,10 @@ private SqmMappingModelHelper() { */ public static EntityPersister resolveEntityPersister( EntityDomainType entityType, - SessionFactoryImplementor sessionFactory) { + MappingMetamodel mappingMetamodel) { // Our EntityTypeImpl#getType impl returns the Hibernate entity-name // which is exactly what we want - final String hibernateEntityName = entityType.getHibernateEntityName(); - return sessionFactory.getRuntimeMetamodels().getMappingMetamodel().getEntityDescriptor( hibernateEntityName ); + return mappingMetamodel.getEntityDescriptor( entityType.getHibernateEntityName() ); } public static SqmPathSource resolveSqmKeyPathSource( @@ -258,7 +256,7 @@ public static EntityMappingType resolveExplicitTreatTarget( if ( treatTarget.getPersistenceType() == Type.PersistenceType.ENTITY ) { return resolveEntityPersister( ( (EntityDomainType) treatTarget ), - converter.getCreationContext().getSessionFactory() + converter.getCreationContext().getMappingMetamodel() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/ExpressionDomainResultProducer.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/ExpressionDomainResultProducer.java index 50a95afc3588..7ecc810a5be3 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/ExpressionDomainResultProducer.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/ExpressionDomainResultProducer.java @@ -58,7 +58,7 @@ private SqlSelection resolveSqlSelection(DomainResultCreationState creationState expression, expression.getExpressionType().getSingleJdbcMapping().getJdbcJavaType(), null, - sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration() + sqlAstCreationState.getCreationContext().getTypeConfiguration() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java index af5e100c1dbe..12b605ed0a78 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java @@ -265,7 +265,7 @@ public static List selectMatchingIds( domainParameterXref, executionContext.getQueryParameterBindings(), executionContext.getSession().getLoadQueryInfluencers(), - factory, + factory.getSqlTranslationEngine(), true ); final SqmTranslation translation = translator.translate(); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/AbstractCteMutationHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/AbstractCteMutationHandler.java index 3e540c8659cc..e60f1d46ff66 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/AbstractCteMutationHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/AbstractCteMutationHandler.java @@ -19,6 +19,7 @@ import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.metamodel.mapping.SqlExpressible; import org.hibernate.query.spi.DomainQueryExecutionContext; +import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.internal.DomainParameterXref; import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter; import org.hibernate.query.sqm.internal.SqmUtil; @@ -119,7 +120,7 @@ public int execute(DomainQueryExecutionContext executionContext) { executionContext.getQueryOptions(), executionContext.getSession().getLoadQueryInfluencers(), executionContext.getQueryParameterBindings(), - factory + factory.getSqlTranslationEngine() ); final Map, List> parameterResolutions; if ( domainParameterXref.getSqmParameterCount() == 0 ) { @@ -214,12 +215,12 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter arg = new SqmStar( factory.getNodeBuilder() ); - return factory.getQueryEngine().getSqmFunctionRegistry().findFunctionDescriptor( "count" ).generateSqmExpression( - arg, - null, - factory.getQueryEngine() - ).convertToSqlAst( sqmConverter ); + final QueryEngine queryEngine = factory.getQueryEngine(); + final SqmExpression arg = new SqmStar( queryEngine.getCriteriaBuilder() ); + return queryEngine.getSqmFunctionRegistry() + .findFunctionDescriptor( "count" ) + .generateSqmExpression( arg, null, queryEngine ) + .convertToSqlAst( sqmConverter ); } protected Predicate createIdSubQueryPredicate( diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertHandler.java index 7729bc24f19a..392331e4e7bb 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertHandler.java @@ -34,6 +34,7 @@ import org.hibernate.query.spi.DomainQueryExecutionContext; import org.hibernate.query.sqm.BinaryArithmeticOperator; import org.hibernate.query.sqm.ComparisonOperator; +import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.SetOperator; import org.hibernate.query.sqm.internal.DomainParameterXref; import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter; @@ -156,14 +157,14 @@ public CteTable getCteTable() { return cteTable; } - public SessionFactoryImplementor getSessionFactory() { - return sessionFactory; - } - public DomainParameterXref getDomainParameterXref() { return domainParameterXref; } + private NodeBuilder getCriteriaBuilder() { + return sessionFactory.getQueryEngine().getCriteriaBuilder(); + } + @Override public int execute(DomainQueryExecutionContext executionContext) { final SqmInsertStatement sqmInsertStatement = getSqmStatement(); @@ -184,7 +185,7 @@ public int execute(DomainQueryExecutionContext executionContext) { executionContext.getQueryOptions(), executionContext.getSession().getLoadQueryInfluencers(), executionContext.getQueryParameterBindings(), - factory + factory.getSqlTranslationEngine() ); final TableGroup insertingTableGroup = sqmConverter.getMutatingTableGroup(); @@ -611,12 +612,10 @@ public MappingModelExpressible getResolvedMappingModelType(SqmParameter arg = new SqmStar( factory.getNodeBuilder() ); - return factory.getQueryEngine().getSqmFunctionRegistry().findFunctionDescriptor( "count" ).generateSqmExpression( - arg, - null, - factory.getQueryEngine() - ).convertToSqlAst( sqmConverter ); + final SqmExpression arg = new SqmStar( getCriteriaBuilder() ); + return factory.getQueryEngine().getSqmFunctionRegistry().findFunctionDescriptor( "count" ) + .generateSqmExpression( arg, null, factory.getQueryEngine() ) + .convertToSqlAst( sqmConverter ); } protected String addDmlCtes( @@ -1032,11 +1031,12 @@ private void handleConflictClause( statement.addCteStatement( new CteStatement( dmlResultCte, insertStatement ) ); } else { + final NodeBuilder nodeBuilder = getCriteriaBuilder(); // Build an exists subquery clause to only insert if no row with a matching constraint column value exists i.e. // insert into target (c1, c2) // select e.c1, e.c2 from HTE_target e // where not exists (select 1 from target excluded where e.c1=excluded.c1 and e.c2=excluded.c2) - final BasicType booleanType = sessionFactory.getNodeBuilder().getBooleanType(); + final BasicType booleanType = nodeBuilder.getBooleanType(); final List constraintColumnNames = conflictClause.getConstraintColumnNames(); final QuerySpec insertQuerySpec = (QuerySpec) insertStatement.getSourceSelectStatement(); final QuerySpec subquery = new QuerySpec( false, 1 ); @@ -1057,14 +1057,14 @@ private void handleConflictClause( sessionFactory ); subquery.getSelectClause().addSqlSelection( - new SqlSelectionImpl( new QueryLiteral<>( 1, sessionFactory.getNodeBuilder().getIntegerType() ) ) + new SqlSelectionImpl( new QueryLiteral<>( 1, nodeBuilder.getIntegerType() ) ) ); subquery.getFromClause().addRoot( tableGroup ); List columnsToMatch; if ( constraintColumnNames.isEmpty() ) { // Assume the primary key columns Predicate predicate = buildColumnMatchPredicate( - columnsToMatch = Arrays.asList( ( (EntityPersister) entityDescriptor).getKeyColumns( tableIndex ) ), + columnsToMatch = Arrays.asList( ((EntityPersister) entityDescriptor).getKeyColumns( tableIndex ) ), insertStatement, false, true @@ -1157,7 +1157,7 @@ private void handleConflictClause( matchCteSubquery.getSelectClause().addSqlSelection( new SqlSelectionImpl( new QueryLiteral<>( 1, - sessionFactory.getNodeBuilder().getIntegerType() + getCriteriaBuilder().getIntegerType() ) ) ); matchCteSubquery.getFromClause().addRoot( updateSubquery.getFromClause().getRoots().get( 0 ) ); @@ -1231,7 +1231,7 @@ private Predicate buildColumnMatchPredicate( InsertSelectStatement dmlStatement, boolean errorIfMissing, boolean compareAgainstSelectItems) { - final BasicType booleanType = sessionFactory.getNodeBuilder().getBooleanType(); + final BasicType booleanType = getCriteriaBuilder().getBooleanType(); final QuerySpec insertQuerySpec = (QuerySpec) dmlStatement.getSourceSelectStatement(); Predicate predicate = null; OUTER: for ( String constraintColumnName : constraintColumnNames ) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/inline/InlineUpdateHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/inline/InlineUpdateHandler.java index 6275c1467b18..2dff8b511915 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/inline/InlineUpdateHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/inline/InlineUpdateHandler.java @@ -103,17 +103,17 @@ public int execute(DomainQueryExecutionContext executionContext) { final List inListExpressions = matchingIdsPredicateProducer.produceIdExpressionList( ids, entityDescriptor ); //noinspection unchecked - final SqmTranslation translation = (SqmTranslation) sessionFactory.getQueryEngine() - .getSqmTranslatorFactory() - .createMutationTranslator( - sqmUpdate, - executionContext.getQueryOptions(), - domainParameterXref, - executionContext.getQueryParameterBindings(), - executionContext.getSession().getLoadQueryInfluencers(), - sessionFactory - ) - .translate(); + final SqmTranslation translation = (SqmTranslation) + sessionFactory.getQueryEngine().getSqmTranslatorFactory() + .createMutationTranslator( + sqmUpdate, + executionContext.getQueryOptions(), + domainParameterXref, + executionContext.getQueryParameterBindings(), + executionContext.getSession().getLoadQueryInfluencers(), + sessionFactory.getSqlTranslationEngine() + ) + .translate(); final TableGroup updatingTableGroup = translation.getSqlAst().getFromClause().getRoots().get( 0 ); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/AbstractDeleteExecutionDelegate.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/AbstractDeleteExecutionDelegate.java index 8d9120def501..30b74fb5fd0d 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/AbstractDeleteExecutionDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/AbstractDeleteExecutionDelegate.java @@ -59,7 +59,7 @@ public AbstractDeleteExecutionDelegate( queryOptions, loadQueryInfluencers, queryParameterBindings, - getSessionFactory() + sessionFactory.getSqlTranslationEngine() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java index 6ee6bded1a3a..429d065b0122 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java @@ -322,7 +322,7 @@ private int insertRootTable( querySpec.setFetchClauseExpression( new QueryLiteral<>( 1, - executionContext.getSession().getFactory().getNodeBuilder() .getIntegerType() + executionContext.getSession().getFactory().getQueryEngine().getCriteriaBuilder().getIntegerType() ), FetchClauseType.ROWS_ONLY ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java index f5e05c74c8c8..f2489357d659 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java @@ -124,7 +124,7 @@ protected ExecutionDelegate resolveDelegate(DomainQueryExecutionContext executio executionContext.getQueryOptions(), executionContext.getSession().getLoadQueryInfluencers(), executionContext.getQueryParameterBindings(), - sessionFactory + sessionFactory.getSqlTranslationEngine() ); final TableGroup insertingTableGroup = converterDelegate.getMutatingTableGroup(); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java index 10eb83210a7f..99b3acc59f34 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java @@ -104,7 +104,7 @@ protected ExecutionDelegate resolveDelegate(DomainQueryExecutionContext executio executionContext.getQueryOptions(), executionContext.getSession().getLoadQueryInfluencers(), executionContext.getQueryParameterBindings(), - sessionFactory + sessionFactory.getSqlTranslationEngine() ); final TableGroup updatingTableGroup = converterDelegate.getMutatingTableGroup(); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java index dc7b2dc9faf2..e5b49539fc7d 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java @@ -11,6 +11,7 @@ import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.JdbcMappingContainer; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.query.sqm.tree.expression.SqmCollation; @@ -24,7 +25,6 @@ import org.hibernate.type.JavaObjectType; import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.jdbc.JdbcType; -import org.hibernate.type.spi.TypeConfiguration; import static org.hibernate.query.sqm.produce.function.FunctionParameterType.COMPARABLE; import static org.hibernate.type.descriptor.java.JavaTypeHelper.isUnknown; @@ -71,8 +71,8 @@ public ArgumentTypesValidator(ArgumentsValidator delegate, FunctionParameterType public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { - delegate.validate( arguments, functionName, typeConfiguration); + BindingContext bindingContext) { + delegate.validate( arguments, functionName, bindingContext ); int count = 0; for (SqmTypedNode argument : arguments) { // JdbcTypeIndicators indicators = typeConfiguration.getCurrentBaseSqlTypeIndicators(); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentsValidator.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentsValidator.java index d9312238cd81..f56458e566ab 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentsValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentsValidator.java @@ -4,6 +4,7 @@ */ package org.hibernate.query.sqm.produce.function; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.sql.ast.tree.SqlAstNode; import org.hibernate.type.spi.TypeConfiguration; @@ -22,8 +23,22 @@ public interface ArgumentsValidator { /** * Perform validation that may be done using the {@link SqmTypedNode} tree and assigned Java types. + * + * @since 7.0 */ - default void validate(List> arguments, String functionName, TypeConfiguration typeConfiguration) {} + default void validate(List> arguments, String functionName, BindingContext bindingContext) { + validate( arguments, functionName, bindingContext.getTypeConfiguration() ); + } + + /** + * Perform validation that may be done using the {@link SqmTypedNode} tree and assigned Java types. + * + * @deprecated Implement {@link #validate(List, String, BindingContext)} instead + */ + @Deprecated(since = "7.0", forRemoval = true) + default void validate(List> arguments, String functionName, TypeConfiguration typeConfiguration) { + throw new UnsupportedOperationException( "Deprecated operation not implemented" ); + } /** * Pretty-print the signature of the argument list. diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/FunctionArgumentTypeResolver.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/FunctionArgumentTypeResolver.java index 155b65962c59..28b97de45cb6 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/FunctionArgumentTypeResolver.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/FunctionArgumentTypeResolver.java @@ -58,7 +58,7 @@ public interface FunctionArgumentTypeResolver { new NamedSqmFunctionDescriptor( "", false, null, null ), null, arguments, - converter.getCreationContext().getSessionFactory().getNodeBuilder() + converter.getSqmCreationContext().getNodeBuilder() ) { @Override public Expression convertToSqlAst(SqmToSqlAstConverter walker) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/StandardArgumentsValidators.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/StandardArgumentsValidators.java index 4908482e3c09..1179a604a3d7 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/StandardArgumentsValidators.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/StandardArgumentsValidators.java @@ -4,8 +4,8 @@ */ package org.hibernate.query.sqm.produce.function; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.tree.SqmTypedNode; -import org.hibernate.type.spi.TypeConfiguration; import java.util.List; import java.util.Locale; @@ -26,6 +26,13 @@ private StandardArgumentsValidators() { * Static validator for performing no validation */ public static final ArgumentsValidator NONE = new ArgumentsValidator() { + @Override + public void validate( + List> arguments, + String functionName, + BindingContext bindingContext) { + // nothing to do + } @Override public String getSignature() { return "([arg0[, ...]])"; @@ -40,7 +47,7 @@ public String getSignature() { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { if ( !arguments.isEmpty() ) { throw new FunctionArgumentException( String.format( @@ -68,7 +75,7 @@ public static ArgumentsValidator min(int minNumOfArgs) { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { if ( arguments.size() < minNumOfArgs ) { throw new FunctionArgumentException( String.format( @@ -105,7 +112,7 @@ public static ArgumentsValidator exactly(int number) { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { if ( arguments.size() != number ) { throw new FunctionArgumentException( String.format( @@ -144,7 +151,7 @@ public static ArgumentsValidator max(int maxNumOfArgs) { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { if ( arguments.size() > maxNumOfArgs ) { throw new FunctionArgumentException( String.format( @@ -179,7 +186,7 @@ public static ArgumentsValidator between(int minNumOfArgs, int maxNumOfArgs) { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { if (arguments.size() < minNumOfArgs || arguments.size() > maxNumOfArgs) { throw new FunctionArgumentException( String.format( @@ -218,7 +225,7 @@ public static ArgumentsValidator of(Class javaType) { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { for ( SqmTypedNode argument : arguments ) { Class argType = argument.getNodeJavaType().getJavaTypeClass(); if ( !javaType.isAssignableFrom( argType ) ) { @@ -247,11 +254,11 @@ public static ArgumentsValidator composite(List validators) public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { validators.forEach( individualValidator -> individualValidator.validate( arguments, functionName, - typeConfiguration + bindingContext ) ); } }; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/internal/SetReturningFunctionTypeResolverBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/internal/SetReturningFunctionTypeResolverBuilder.java index b1ebf9d57cad..94fb31055914 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/internal/SetReturningFunctionTypeResolverBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/internal/SetReturningFunctionTypeResolverBuilder.java @@ -170,10 +170,9 @@ public SelectableMapping[] resolveFunctionReturnType( } private String determineIndexSelectionExpression(SelectableMapping[] selectableMappings, String tableIdentifierVariable, SqmToSqlAstConverter walker) { - final String defaultOrdinalityColumnName = walker.getCreationContext().getSessionFactory() - .getJdbcServices() - .getDialect() - .getDefaultOrdinalityColumnName(); + final String defaultOrdinalityColumnName = + walker.getCreationContext().getDialect() + .getDefaultOrdinalityColumnName(); String name = defaultOrdinalityColumnName == null ? "i" : defaultOrdinalityColumnName; OUTER: for ( int i = 0; i < selectableMappings.length; i++ ) { for ( SelectableMapping selectableMapping : selectableMappings ) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationContext.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationContext.java index e5f27d525868..7e289dec3251 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationContext.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationContext.java @@ -5,6 +5,8 @@ package org.hibernate.query.sqm.spi; import org.hibernate.Incubating; +import org.hibernate.metamodel.MappingMetamodel; +import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.query.BindingContext; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.NodeBuilder; @@ -27,5 +29,17 @@ default NodeBuilder getNodeBuilder() { * objects are not available to the query validator * in Hibernate Processor at compilation time. */ - Class classForName(String className); + default Class classForName(String className) { + return getQueryEngine().getClassLoaderService().classForName( className ); + } + + @Override + default MappingMetamodel getMappingMetamodel() { + return getQueryEngine().getMappingMetamodel(); + } + + @Override + default JpaMetamodel getJpaMetamodel() { + return getQueryEngine().getJpaMetamodel(); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java index b28b0d0080be..45996890f138 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java @@ -552,9 +552,7 @@ public BaseSqmToSqlAstConverter( boolean deduplicateSelectionItems) { this.inferrableTypeAccessStack.push( () -> null ); this.creationContext = creationContext; - this.jpaQueryComplianceEnabled = - creationContext.getSessionFactory().getSessionFactoryOptions() - .getJpaCompliance().isJpaQueryComplianceEnabled(); + this.jpaQueryComplianceEnabled = creationContext.isJpaQueryComplianceEnabled(); this.statement = statement; this.currentSqmStatement = statement; @@ -598,7 +596,7 @@ public BaseSqmToSqlAstConverter( this.domainParameterXref = domainParameterXref; this.domainParameterBindings = domainParameterBindings; this.jpaCriteriaParamResolutions = domainParameterXref.getParameterResolutions().getJpaCriteriaParamResolutions(); - this.domainModel = creationContext.getSessionFactory().getRuntimeMetamodels().getMappingMetamodel(); + this.domainModel = creationContext.getMappingMetamodel(); } private static EntityGraphTraversalState entityGraphTraversalState(SqlAstCreationContext creationContext, QueryOptions queryOptions) { @@ -608,7 +606,7 @@ private static EntityGraphTraversalState entityGraphTraversalState(SqlAstCreatio && appliedGraph.getGraph() != null ) { return new StandardEntityGraphTraversalStateImpl( appliedGraph.getSemantic(), appliedGraph.getGraph(), - creationContext.getSessionFactory().getJpaMetamodel() + creationContext.getJpaMetamodel() ); } else { @@ -684,7 +682,7 @@ protected SqmStatement getStatement() { @Override public Dialect getDialect() { - return creationContext.getSessionFactory().getJdbcServices().getDialect(); + return creationContext.getDialect(); } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -692,7 +690,7 @@ public Dialect getDialect() { @Override public TypeConfiguration getTypeConfiguration() { - return creationContext.getSessionFactory().getTypeConfiguration(); + return creationContext.getTypeConfiguration(); } @Override @@ -833,10 +831,9 @@ public UpdateStatement visitUpdateStatement(SqmUpdateStatement sqmStatement) final SqmRoot sqmTarget = sqmStatement.getTarget(); final String entityName = sqmTarget.getEntityName(); - final EntityPersister entityDescriptor = getCreationContext() - .getSessionFactory() - .getMappingMetamodel() - .getEntityDescriptor( entityName ); + final EntityPersister entityDescriptor = + getCreationContext().getMappingMetamodel() + .getEntityDescriptor( entityName ); assert entityDescriptor != null; final FromClause fromClause = new FromClause( 1 ); @@ -885,7 +882,7 @@ public void addVersionedAssignment(Consumer assignmentConsumer, SqmU return; } final EntityPersister persister = - creationContext.getSessionFactory().getMappingMetamodel() + creationContext.getMappingMetamodel() .findEntityDescriptor( sqmStatement.getTarget().getEntityName() ); if ( !persister.isVersioned() ) { throw new SemanticException( "Increment option specified for update of non-versioned entity" ); @@ -951,7 +948,7 @@ public List visitSetClause(SqmSetClause setClause) { final SqmRoot target = ( (SqmDmlStatement) currentSqmStatement ).getTarget(); final String entityName = target.getEntityName(); final EntityPersister entityDescriptor = - getCreationContext().getSessionFactory().getMappingMetamodel() + getCreationContext().getMappingMetamodel() .getEntityDescriptor( entityName ); // Returns a new instance for collecting assignments if needed @@ -1096,7 +1093,7 @@ public DeleteStatement visitDeleteStatement(SqmDeleteStatement statement) { final SqmRoot sqmTarget = statement.getTarget(); final String entityName = sqmTarget.getEntityName(); final EntityPersister entityDescriptor = - creationContext.getSessionFactory().getMappingMetamodel() + creationContext.getMappingMetamodel() .getEntityDescriptor( entityName ); assert entityDescriptor != null; @@ -1152,7 +1149,7 @@ public InsertStatement visitInsertSelectStatement(SqmInsertSelectStatement sq this.currentSqmStatement = sqmStatement; final String entityName = sqmStatement.getTarget().getEntityName(); final EntityPersister entityDescriptor = - creationContext.getSessionFactory().getMappingMetamodel() + creationContext.getMappingMetamodel() .getEntityDescriptor( entityName ); assert entityDescriptor != null; @@ -1262,7 +1259,7 @@ public InsertStatement visitInsertValuesStatement(SqmInsertValuesStatement sq this.currentSqmStatement = sqmStatement; final String entityName = sqmStatement.getTarget().getEntityName(); final EntityPersister entityDescriptor = - creationContext.getSessionFactory().getMappingMetamodel() + creationContext.getMappingMetamodel() .getEntityDescriptor( entityName ); assert entityDescriptor != null; @@ -1452,7 +1449,7 @@ else if ( !( identifierGenerator instanceof BulkInsertionCapableIdentifierGenera // If the dialect does not support window functions, we don't need the id column in the temporary table insert // because we will make use of the special "rn_" column that is auto-incremented and serves as temporary identifier for a row, // which is needed to control the generation of proper identifier values with the generator afterward - addIdColumn = creationContext.getSessionFactory().getJdbcServices().getDialect().supportsWindowFunctions(); + addIdColumn = creationContext.getDialect().supportsWindowFunctions(); } else { // If the generator supports bulk insertion and the optimizer uses an increment size of 1, @@ -1688,7 +1685,7 @@ public CteStatement visitCteStatement(SqmCteStatement sqmCteStatement) { final Literal noCycleLiteral = getLiteral( sqmCteStatement.getNoCycleLiteral() ); final JdbcMapping cycleMarkType = cycleLiteral == null ? null : cycleLiteral.getJdbcMapping(); final BasicType stringType = - creationContext.getSessionFactory().getTypeConfiguration() + creationContext.getTypeConfiguration() .getBasicTypeForJavaType( String.class ); if ( queryPart instanceof SqmQueryGroup queryGroup && queryPart.getSortSpecifications().isEmpty() @@ -2950,7 +2947,7 @@ private void consumeJoins(SqmRoot sqmRoot, FromClauseIndex fromClauseIndex, T } private EntityPersister resolveEntityPersister(EntityDomainType entityDomainType) { - return creationContext.getSessionFactory().getMappingMetamodel() + return creationContext.getMappingMetamodel() .getEntityDescriptor( entityDomainType.getHibernateEntityName() ); } @@ -3095,18 +3092,17 @@ private void registerEntityNameUsage( EntityNameUse entityNameUse, String treatTargetTypeName, boolean projection) { - final SessionFactoryImplementor factory = creationContext.getSessionFactory(); final EntityPersister persister; if ( tableGroup.getModelPart() instanceof EmbeddableValuedModelPart ) { persister = null; final EmbeddableDomainType embeddableDomainType = - factory.getJpaMetamodel().findEmbeddableType( treatTargetTypeName ); + creationContext.getJpaMetamodel().findEmbeddableType( treatTargetTypeName ); if ( embeddableDomainType == null || !embeddableDomainType.isPolymorphic() ) { return; } } else { - persister = factory.getMappingMetamodel().findEntityDescriptor( treatTargetTypeName ); + persister = creationContext.getMappingMetamodel().findEntityDescriptor( treatTargetTypeName ); if ( persister == null || !persister.getEntityMetamodel().isPolymorphic() ) { return; } @@ -4318,9 +4314,7 @@ else if ( entityValuedModelPart instanceof AnonymousTupleEntityValuedModelPart ) final EntityMappingType treatedMapping; if ( path instanceof SqmTreatedPath && ( (SqmTreatedPath) path ).getTreatTarget().getPersistenceType() == ENTITY ) { final ManagedDomainType treatTarget = ( (SqmTreatedPath) path ).getTreatTarget(); - treatedMapping = creationContext.getSessionFactory() - .getRuntimeMetamodels() - .getMappingMetamodel() + treatedMapping = creationContext.getMappingMetamodel() .findEntityDescriptor( treatTarget.getTypeName() ); } else { @@ -4498,10 +4492,7 @@ else if ( appliedByUnit != null ) { private Expression extractEpoch(Expression intervalExpression) { final BasicType intType = getTypeConfiguration().getBasicTypeForJavaType( Integer.class ); final PatternRenderer patternRenderer = new PatternRenderer( - creationContext.getSessionFactory() - .getJdbcServices() - .getDialect() - .extractPattern( EPOCH ) + creationContext.getDialect().extractPattern( EPOCH ) ); return new SelfRenderingFunctionSqlAstExpression<>( "extract", @@ -4628,7 +4619,7 @@ protected Expression createMinOrMaxIndexOrElement( boolean index, String functionName) { // Try to create a lateral sub-query join if possible which allows the re-use of the expression - if ( creationContext.getSessionFactory().getJdbcServices().getDialect().supportsLateral() ) { + if ( creationContext.getDialect().supportsLateral() ) { return createLateralJoinExpression( pluralPartPath, index, functionName ); } else { @@ -4961,11 +4952,9 @@ else if ( collectionPart instanceof ManyToManyCollectionPart ) { } private AbstractSqmSelfRenderingFunctionDescriptor resolveFunction(String function) { - return (AbstractSqmSelfRenderingFunctionDescriptor) creationContext - .getSessionFactory() - .getQueryEngine() - .getSqmFunctionRegistry() - .findFunctionDescriptor( function ); + return (AbstractSqmSelfRenderingFunctionDescriptor) + creationContext.getSqmFunctionRegistry() + .findFunctionDescriptor( function ); } protected Expression createLateralJoinExpression( @@ -5477,10 +5466,9 @@ private Set determineEntityNamesForTreatTypeRestriction( private Set determineEmbeddableNamesForTreatTypeRestriction( EmbeddableMappingType embeddableMappingType, Map entityNameUses) { - final EmbeddableDomainType embeddableDomainType = creationContext.getSessionFactory() - .getRuntimeMetamodels() - .getJpaMetamodel() - .embeddable( embeddableMappingType.getJavaType().getJavaTypeClass() ); + final EmbeddableDomainType embeddableDomainType = + creationContext.getJpaMetamodel() + .embeddable( embeddableMappingType.getJavaType().getJavaTypeClass() ); final Set entityNameUsesSet = new HashSet<>( entityNameUses.keySet() ); ManagedDomainType superType = embeddableDomainType; while ( superType != null ) { @@ -5547,9 +5535,7 @@ private Expression getTypeLiteral(SqmPathInterpretation typeExpression, Strin return new EntityTypeLiteral( domainModel.findEntityDescriptor( typeName ) ); } else { - final EmbeddableDomainType embeddable = - creationContext.getSessionFactory().getJpaMetamodel() - .embeddable( typeName ); + final EmbeddableDomainType embeddable = creationContext.getJpaMetamodel().embeddable( typeName ); return new EmbeddableTypeLiteral( embeddable, (BasicType) typeExpression.getExpressionType().getSingleJdbcMapping() ); } @@ -5626,8 +5612,7 @@ else if ( expressible instanceof EntityValuedModelPart entityValuedModelPart ) { final BasicSqmPathSource nodeType = (BasicSqmPathSource) literal.getNodeType(); return new QueryLiteral<>( literal.getLiteralValue(), - creationContext.getSessionFactory().getTypeConfiguration() - .getBasicTypeRegistry() + creationContext.getTypeConfiguration().getBasicTypeRegistry() .getRegisteredType( nodeType.getSqmPathType().getJavaType().getName() ) ); } @@ -5637,7 +5622,7 @@ else if ( expressible instanceof EntityValuedModelPart entityValuedModelPart ) { private MappingModelExpressible literalExpressible(SqmLiteral literal, MappingModelExpressible inferableExpressible) { final MappingModelExpressible localExpressible = resolveMappingModelExpressible( literal, - creationContext.getSessionFactory().getMappingMetamodel(), + creationContext.getMappingMetamodel(), getFromClauseAccess() == null ? null : getFromClauseAccess()::findTableGroup ); if ( localExpressible == null ) { return getElementExpressible( inferableExpressible ); @@ -5769,7 +5754,7 @@ else if ( Number.class.isAssignableFrom( valueConverter.getRelationalJavaType(). && value instanceof Number ) { return valueConverter.getRelationalJavaType().coerce( value, - creationContext.getSessionFactory()::getTypeConfiguration + creationContext::getTypeConfiguration ); } else { @@ -5789,9 +5774,7 @@ private EntityTypeLiteral entityTypeLiteral(SqmLiteral literal, Discrimin final E literalValue = literal.getLiteralValue(); final EntityPersister entityDescriptor; if ( literalValue instanceof Class clazz ) { - entityDescriptor = - creationContext.getSessionFactory().getMappingMetamodel() - .findEntityDescriptor( clazz ); + entityDescriptor = creationContext.getMappingMetamodel().findEntityDescriptor( clazz ); } else { @SuppressWarnings("unchecked") @@ -5817,7 +5800,7 @@ else if ( valueConverter.getRelationalJavaType().isInstance( literalValue ) ) { // In this case, we use wrap to transform the value to the correct type final E relationalForm = valueConverter.getRelationalJavaType() - .wrap( literalValue, creationContext.getSessionFactory().getWrapperOptions() ); + .wrap( literalValue, creationContext.getWrapperOptions() ); return valueConverter.getDetailsForRelationalForm( relationalForm ); } } @@ -6579,9 +6562,8 @@ public Object visitFormat(SqmFormat sqmFormat) { @Override public Object visitCoalesce(SqmCoalesce sqmCoalesce) { - final SessionFactoryImplementor sessionFactory = creationContext.getSessionFactory(); - final QueryEngine queryEngine = sessionFactory.getQueryEngine(); - return queryEngine.getSqmFunctionRegistry().findFunctionDescriptor( "coalesce" ) + final QueryEngine queryEngine = creationContext.getSessionFactory().getQueryEngine(); + return creationContext.getSqmFunctionRegistry().findFunctionDescriptor( "coalesce" ) .generateSqmExpression( sqmCoalesce.getArguments(), null, queryEngine ) .accept( this ); } @@ -6908,15 +6890,13 @@ private BasicType basicType(Class javaType) { private TimestampaddFunction timestampadd() { return (TimestampaddFunction) - getCreationContext().getSessionFactory() - .getQueryEngine().getSqmFunctionRegistry() + getCreationContext().getSqmFunctionRegistry() .findFunctionDescriptor( "timestampadd" ); } private TimestampdiffFunction timestampdiff() { return (TimestampdiffFunction) - getCreationContext().getSessionFactory() - .getQueryEngine().getSqmFunctionRegistry() + getCreationContext().getSqmFunctionRegistry() .findFunctionDescriptor( "timestampdiff" ); } @@ -7230,8 +7210,7 @@ public CaseSearchedExpression visitSearchedCaseExpression(SqmCaseSearched exp } private MappingModelExpressible determineCurrentExpressible(SqmTypedNode expression) { - return creationContext.getSessionFactory() - .getMappingMetamodel() + return creationContext.getMappingMetamodel() .resolveMappingExpressible( expression.getNodeType(), getFromClauseIndex()::findTableGroup ); } @@ -7299,7 +7278,7 @@ private Summarization.Kind getSummarizationKind(SqmSummarization.Kind kind) { @Override public Expression visitEntityTypeLiteralExpression(SqmLiteralEntityType sqmExpression) { final EntityPersister mappingDescriptor = - creationContext.getSessionFactory().getMappingMetamodel() + creationContext.getMappingMetamodel() .getEntityDescriptor( sqmExpression.getNodeType().getHibernateEntityName() ); return new EntityTypeLiteral( mappingDescriptor ); } @@ -8336,7 +8315,6 @@ private Fetch createFetch(FetchParent fetchParent, Fetchable fetchable, Boolean FetchTiming fetchTiming = fetchable.getMappedFetchOptions().getTiming(); boolean joined = false; - final NavigablePath fetchablePath; final Integer maxDepth = getCreationContext().getMaximumFetchDepth(); final FromClauseIndex fromClauseIndex = getFromClauseIndex(); final SqmAttributeJoin fetchedJoin = fromClauseIndex.findFetchedJoinByPath( resolvedNavigablePath ); @@ -8346,6 +8324,7 @@ private Fetch createFetch(FetchParent fetchParent, Fetchable fetchable, Boolean TableGroup joinedTableGroup = null; + final NavigablePath fetchablePath; if ( fetchedJoin != null ) { fetchablePath = fetchedJoin.getNavigablePath(); // there was an explicit fetch in the SQM @@ -8390,8 +8369,7 @@ else if ( getLoadQueryInfluencers().hasEnabledFetchProfiles() ) { for ( String enabledFetchProfileName : getLoadQueryInfluencers().getEnabledFetchProfileNames() ) { final FetchProfile enabledFetchProfile = - getCreationContext().getSessionFactory() - .getFetchProfile( enabledFetchProfileName ); + getCreationContext().getFetchProfile( enabledFetchProfileName ); final org.hibernate.engine.profile.Fetch profileFetch = enabledFetchProfile.getFetchByRole( fetchableRole ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/BasicValuedPathInterpretation.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/BasicValuedPathInterpretation.java index 0da208fdd096..ccd9db855275 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/BasicValuedPathInterpretation.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/BasicValuedPathInterpretation.java @@ -53,10 +53,7 @@ public static BasicValuedPathInterpretation from( if ( lhs instanceof SqmTreatedPath && ( (SqmTreatedPath) lhs ).getTreatTarget().getPersistenceType() == ENTITY ) { final EntityDomainType treatTargetDomainType = (EntityDomainType) ( (SqmTreatedPath) lhs ).getTreatTarget(); - final MappingMetamodel mappingMetamodel = sqlAstCreationState.getCreationContext() - .getSessionFactory() - .getRuntimeMetamodels() - .getMappingMetamodel(); + final MappingMetamodel mappingMetamodel = sqlAstCreationState.getCreationContext().getMappingMetamodel(); final EntityPersister treatEntityDescriptor = mappingMetamodel.findEntityDescriptor( treatTargetDomainType.getHibernateEntityName() ); final MappingType tableGroupMappingType = tableGroup.getModelPart().getPartMappingType(); if ( tableGroupMappingType instanceof EntityMappingType @@ -71,11 +68,8 @@ public static BasicValuedPathInterpretation from( else { modelPartContainer = tableGroup.getModelPart(); if ( jpaQueryComplianceEnabled && lhs.getNodeType() instanceof EntityDomainType entityDomainType ) { - final MappingMetamodel mappingMetamodel = sqlAstCreationState.getCreationContext() - .getSessionFactory() - .getRuntimeMetamodels() - .getMappingMetamodel(); - treatTarget = mappingMetamodel.findEntityDescriptor( entityDomainType.getHibernateEntityName() ); + treatTarget = sqlAstCreationState.getCreationContext().getMappingMetamodel() + .findEntityDescriptor( entityDomainType.getHibernateEntityName() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EmbeddableValuedExpression.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EmbeddableValuedExpression.java index 1df059387981..d7631c82e90c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EmbeddableValuedExpression.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EmbeddableValuedExpression.java @@ -73,9 +73,7 @@ public void applySqlSelections(DomainResultCreationState creationState) { final EmbeddableMappingType mappingType = mapping.getEmbeddableTypeDescriptor(); final int numberOfAttributeMappings = mappingType.getNumberOfAttributeMappings(); final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState(); - final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext() - .getSessionFactory() - .getTypeConfiguration(); + final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); for ( int i = 0; i < numberOfAttributeMappings; i++ ) { final AttributeMapping attributeMapping = mappingType.getAttributeMapping( i ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EmbeddableValuedPathInterpretation.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EmbeddableValuedPathInterpretation.java index 627d59dc40ac..35a6b3cd73c0 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EmbeddableValuedPathInterpretation.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EmbeddableValuedPathInterpretation.java @@ -45,10 +45,7 @@ public static Expression from( final TableGroup tableGroup = sqlAstCreationState.getFromClauseAccess().getTableGroup( lhs.getNavigablePath() ); EntityMappingType treatTarget = null; if ( jpaQueryComplianceEnabled ) { - final MappingMetamodel mappingMetamodel = sqlAstCreationState.getCreationContext() - .getSessionFactory() - .getRuntimeMetamodels() - .getMappingMetamodel(); + final MappingMetamodel mappingMetamodel = sqlAstCreationState.getCreationContext().getMappingMetamodel(); if ( lhs instanceof SqmTreatedPath && ( (SqmTreatedPath) lhs ).getTreatTarget().getPersistenceType() == ENTITY ) { final EntityDomainType treatTargetDomainType = (EntityDomainType) ( (SqmTreatedPath) lhs ).getTreatTarget(); treatTarget = mappingMetamodel.findEntityDescriptor( treatTargetDomainType.getHibernateEntityName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EntityValuedPathInterpretation.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EntityValuedPathInterpretation.java index 292531ad01fa..f8e842a07063 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EntityValuedPathInterpretation.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/EntityValuedPathInterpretation.java @@ -287,10 +287,7 @@ public static EntityValuedPathInterpretation from( if ( expandToAllColumns ) { // Expand to all columns of the entity mapping type to ensure a correct group / order by expression, // or use only the primary key if the dialect supports functional dependency - final Dialect dialect = sqlAstCreationState.getCreationContext() - .getSessionFactory() - .getJdbcServices() - .getDialect(); + final Dialect dialect = sqlAstCreationState.getCreationContext().getDialect(); final EntityMappingType entityMappingType = mapping.getEntityMappingType(); final EntityIdentifierMapping identifierMapping = entityMappingType.getIdentifierMapping(); final List expressions = new ArrayList<>( identifierMapping.getJdbcTypeCount() ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/SqmParameterInterpretation.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/SqmParameterInterpretation.java index 1282401e0cc8..6a96162c29c8 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/SqmParameterInterpretation.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/SqmParameterInterpretation.java @@ -98,7 +98,7 @@ public DomainResult createDomainResult( resolvedExpression, jdbcJavaType, null, - creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration() + creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); return new BasicResult( @@ -135,7 +135,7 @@ public SqlSelection resolveSqlSelection(DomainResultCreationState creationState) resolvedExpression, resolvedExpression.getExpressionType().getSingleJdbcMapping().getMappedJavaType(), null, - creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration() + creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleBasicValuedModelPart.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleBasicValuedModelPart.java index 80e8c26793a6..25ac2300a323 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleBasicValuedModelPart.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleBasicValuedModelPart.java @@ -287,7 +287,7 @@ private SqlSelection resolveSqlSelection( expression, getJdbcMapping().getJdbcJavaType(), fetchParent, - creationState.getCreationContext().getSessionFactory().getTypeConfiguration() + creationState.getCreationContext().getTypeConfiguration() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationContext.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationContext.java index 19401dde2c70..590f7cba7c07 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationContext.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationContext.java @@ -4,9 +4,13 @@ */ package org.hibernate.sql.ast.spi; +import org.hibernate.dialect.Dialect; +import org.hibernate.engine.profile.FetchProfile; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.spi.MappingMetamodelImplementor; import org.hibernate.query.BindingContext; +import org.hibernate.query.sqm.function.SqmFunctionRegistry; +import org.hibernate.type.descriptor.WrapperOptions; /** * The "context" in which creation of SQL AST occurs. Provides @@ -16,12 +20,21 @@ */ public interface SqlAstCreationContext extends BindingContext { /** - * The SessionFactory + * Avoid calling this method directly, as much as possible. + * SQL AST creation should not depend on the existence of + * a session factory, so if you need to obtain this object, + * there's something wrong with the design. + *

+ * Currently this is only called when creating a + * {@link org.hibernate.sql.ast.tree.from.TableGroup}, + * but we will introduce a new sort of creation context + * for that, probably. */ + @Deprecated SessionFactoryImplementor getSessionFactory(); /** - * The runtime MappingMetamodelImplementor + * The runtime {@link MappingMetamodelImplementor} */ MappingMetamodelImplementor getMappingMetamodel(); @@ -30,4 +43,38 @@ public interface SqlAstCreationContext extends BindingContext { * defines a limit to how deep we should join for fetches. */ Integer getMaximumFetchDepth(); + + /** + * @see org.hibernate.jpa.spi.JpaCompliance#isJpaQueryComplianceEnabled + */ + boolean isJpaQueryComplianceEnabled(); + + /** + * Obtain the definition of a named {@link FetchProfile}. + * + * @param name The name of the fetch profile + */ + FetchProfile getFetchProfile(String name); + + /** + * Obtain the {@link SqmFunctionRegistry}. + */ + default SqmFunctionRegistry getSqmFunctionRegistry() { + return getSessionFactory().getQueryEngine().getSqmFunctionRegistry(); + } + + /** + * Obtain the {@link Dialect}. + */ + default Dialect getDialect() { + return getSessionFactory().getQueryEngine().getDialect(); + } + + /** + * Obtain the "incomplete" {@link WrapperOptions} that would be + * returned by {@link SessionFactoryImplementor#getWrapperOptions()}. + */ + default WrapperOptions getWrapperOptions() { + return getSessionFactory().getWrapperOptions(); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationState.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationState.java index 7c32e8d192d5..586c0bb92894 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationState.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationState.java @@ -9,6 +9,7 @@ import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.metamodel.mapping.ordering.OrderByFragment; import org.hibernate.persister.entity.EntityNameUse; +import org.hibernate.query.sqm.spi.SqmCreationContext; import org.hibernate.sql.ast.tree.from.TableGroup; /** @@ -29,6 +30,10 @@ public interface SqlAstCreationState { LoadQueryInfluencers getLoadQueryInfluencers(); + default SqmCreationContext getSqmCreationContext() { + return getCreationContext().getSessionFactory().getQueryEngine().getCriteriaBuilder(); + } + boolean applyOnlyLoadByKeyFilters(); void registerLockMode(String identificationVariable, LockMode explicitLockMode); diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/CaseSearchedExpression.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/CaseSearchedExpression.java index 2416f15e866d..1b52c1e1f3fa 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/CaseSearchedExpression.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/CaseSearchedExpression.java @@ -66,10 +66,7 @@ public DomainResult createDomainResult( this, type.getJdbcMapping().getJdbcJavaType(), null, - creationState.getSqlAstCreationState() - .getCreationContext() - .getSessionFactory() - .getTypeConfiguration() + creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); return new BasicResult( diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/Over.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/Over.java index 487b2023f04c..b8a05e8e94cf 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/Over.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/Over.java @@ -136,7 +136,7 @@ private SqlSelection createSelection(SqlAstCreationState creationState) { this, expression.getExpressionType().getSingleJdbcMapping().getJdbcJavaType(), null, - creationState.getCreationContext().getSessionFactory().getTypeConfiguration() + creationState.getCreationContext().getTypeConfiguration() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/QueryLiteral.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/QueryLiteral.java index 18244b7aa828..198aae3e81f4 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/QueryLiteral.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/QueryLiteral.java @@ -66,10 +66,7 @@ public DomainResult createDomainResult( this, expressible.getJdbcMapping().getJdbcJavaType(), null, - creationState.getSqlAstCreationState() - .getCreationContext() - .getSessionFactory() - .getTypeConfiguration() + creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration() ); return new BasicResult<>( diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/UnparsedNumericLiteral.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/UnparsedNumericLiteral.java index ff1d2190bca1..caafd91dd062 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/UnparsedNumericLiteral.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/UnparsedNumericLiteral.java @@ -74,8 +74,10 @@ public JdbcMappingContainer getExpressionType() { @Override public DomainResult createDomainResult(String resultVariable, DomainResultCreationState creationState) { - final SqlExpressionResolver sqlExpressionResolver = creationState.getSqlAstCreationState().getSqlExpressionResolver(); - final TypeConfiguration typeConfiguration = creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration(); + final SqlExpressionResolver sqlExpressionResolver = + creationState.getSqlAstCreationState().getSqlExpressionResolver(); + final TypeConfiguration typeConfiguration = + creationState.getSqlAstCreationState().getCreationContext().getTypeConfiguration(); final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( this, diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java index 79fe8ce72d66..9fe53923cd1e 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java @@ -433,11 +433,7 @@ public BasicType resolveType( if ( columnNames == null ) { initializeArrays(); } - final BasicType basicType = resultSetAccess.resolveType( - position, - explicitJavaType, - typeConfiguration - ); + final BasicType basicType = resultSetAccess.resolveType( position, explicitJavaType, typeConfiguration ); types[position - 1] = basicType; return basicType; } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableFetchImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableFetchImpl.java index 1fa70884593d..5943230e4185 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableFetchImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableFetchImpl.java @@ -92,9 +92,7 @@ public AggregateEmbeddableFetchImpl( final TableReference tableReference = tableGroup.getPrimaryTableReference(); final SelectableMapping selectableMapping = fetchContainer.getAggregateMapping(); final Expression expression = sqlExpressionResolver.resolveSqlExpression( tableReference, selectableMapping ); - final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext() - .getSessionFactory() - .getTypeConfiguration(); + final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); final SqlSelection aggregateSelection = sqlExpressionResolver.resolveSqlSelection( expression, typeConfiguration.getJavaTypeRegistry().resolveDescriptor( Object[].class ), diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableResultImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableResultImpl.java index 7bbe3de03a89..9ab2ef22bc66 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/AggregateEmbeddableResultImpl.java @@ -94,9 +94,7 @@ public AggregateEmbeddableResultImpl( final TableReference tableReference = tableGroup.getPrimaryTableReference(); final SelectableMapping selectableMapping = embeddedPartDescriptor.getEmbeddableTypeDescriptor().getAggregateMapping(); final Expression expression = sqlExpressionResolver.resolveSqlExpression( tableReference, selectableMapping ); - final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext() - .getSessionFactory() - .getTypeConfiguration(); + final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); final SqlSelection aggregateSelection = sqlExpressionResolver.resolveSqlSelection( expression, // Using the Object[] type here, so that a different JDBC extractor is chosen diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableExpressionResultImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableExpressionResultImpl.java index e30c8ed18ebe..d1316a385b89 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableExpressionResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableExpressionResultImpl.java @@ -52,9 +52,7 @@ public EmbeddableExpressionResultImpl( final EmbeddableMappingType mappingType = modelPart.getEmbeddableTypeDescriptor(); final int numberOfAttributeMappings = mappingType.getNumberOfAttributeMappings(); final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState(); - final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext() - .getSessionFactory() - .getTypeConfiguration(); + final TypeConfiguration typeConfiguration = sqlAstCreationState.getCreationContext().getTypeConfiguration(); final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); for ( int i = 0; i < numberOfAttributeMappings; i++ ) { final BasicAttributeMapping attribute = (BasicAttributeMapping) mappingType.getAttributeMapping( i ); diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableInitializerImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableInitializerImpl.java index 8d17697e57a0..67075a3b5da2 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableInitializerImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/EmbeddableInitializerImpl.java @@ -10,7 +10,6 @@ import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer; import org.hibernate.engine.internal.ManagedTypeHelper; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.EmbeddableMappingType; import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; @@ -57,7 +56,6 @@ public class EmbeddableInitializerImpl extends AbstractInitializer parent; private final boolean isResultInitializer; private final boolean isPartOfKey; - private final SessionFactoryImplementor sessionFactory; protected final DomainResultAssembler[][] assemblers; protected final BasicResultAssembler discriminatorAssembler; @@ -115,7 +113,6 @@ public EmbeddableInitializerImpl( this.isPartOfKey = embedded.isEntityIdentifierMapping() || Initializer.isPartOfKey( navigablePath, parent ); // We never want to create empty composites for the FK target or PK, otherwise collections would break - this.sessionFactory = creationState.getSqlAstCreationContext().getSessionFactory(); final Collection concreteEmbeddableTypes = embeddableMappingType.getConcreteEmbeddableTypes(); final DomainResultAssembler[][] assemblers = new DomainResultAssembler[concreteEmbeddableTypes.isEmpty() ? 1 : concreteEmbeddableTypes.size()][]; final @Nullable Initializer[][] subInitializers = new Initializer[assemblers.length][]; diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NonAggregatedIdentifierMappingInitializer.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NonAggregatedIdentifierMappingInitializer.java index 2aef9bf9b39c..56fc874e35cb 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NonAggregatedIdentifierMappingInitializer.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NonAggregatedIdentifierMappingInitializer.java @@ -8,7 +8,6 @@ import java.util.function.Function; import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.EmbeddableMappingType; import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; @@ -52,7 +51,6 @@ public class NonAggregatedIdentifierMappingInitializer extends AbstractInitializ private final EmbeddableMappingType representationEmbeddable; private final EmbeddableInstantiator embeddableInstantiator; private final @Nullable InitializerParent parent; - private final SessionFactoryImplementor sessionFactory; private final boolean isResultInitializer; private final DomainResultAssembler[] assemblers; @@ -124,8 +122,6 @@ protected NonAggregatedIdentifierMappingInitializer( this.embeddableInstantiator = representationEmbeddable.getRepresentationStrategy().getInstantiator(); this.hasIdClass = embedded.hasContainingClass() && virtualIdEmbeddable != representationEmbeddable; - this.sessionFactory = creationState.getSqlAstCreationContext().getSessionFactory(); - final int size = virtualIdEmbeddable.getNumberOfFetchables(); final DomainResultAssembler[] assemblers = new DomainResultAssembler[size]; this.assemblers = assemblers; diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/internal/SqlSelectionImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/internal/SqlSelectionImpl.java index daa8e51108c2..8af68806c810 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/internal/SqlSelectionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/internal/SqlSelectionImpl.java @@ -157,7 +157,7 @@ public SqlSelection resolve(JdbcValuesMetadata jdbcResultsMetadata, SessionFacto final BasicType resolvedType = jdbcResultsMetadata.resolveType( jdbcPosition, null, - sessionFactory + sessionFactory.getTypeConfiguration() ); return new ResolvedSqlSelection( jdbcPosition, diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/StandardJdbcValuesMapping.java b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/StandardJdbcValuesMapping.java index e677bda708dd..c4215499b33b 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/StandardJdbcValuesMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/StandardJdbcValuesMapping.java @@ -115,10 +115,11 @@ public JdbcValuesMappingResolution resolveAssemblers(SessionFactoryImplementor s } final AssemblerCreationStateImpl creationState = new AssemblerCreationStateImpl( this, - sessionFactory + sessionFactory.getSqlTranslationEngine() ); - DomainResultAssembler[] domainResultAssemblers = resolveAssemblers( creationState ).toArray(new DomainResultAssembler[0]); + DomainResultAssembler[] domainResultAssemblers = + resolveAssemblers( creationState ).toArray(new DomainResultAssembler[0]); creationState.initializerMap.logInitializers(); return this.resolution = new JdbcValuesMappingResolutionImpl( domainResultAssemblers, @@ -148,7 +149,7 @@ public LockMode determineDefaultLockMode(String alias, LockMode defaultLockMode) private static class AssemblerCreationStateImpl implements AssemblerCreationState { private final JdbcValuesMapping jdbcValuesMapping; - private final SessionFactoryImplementor sessionFactory; + private final SqlAstCreationContext sqlAstCreationContexty; //custom Map private final NavigablePathMapToInitializer initializerMap = new NavigablePathMapToInitializer(); private final InitializersList.Builder initializerListBuilder = new InitializersList.Builder(); @@ -159,9 +160,9 @@ private static class AssemblerCreationStateImpl implements AssemblerCreationStat public AssemblerCreationStateImpl( JdbcValuesMapping jdbcValuesMapping, - SessionFactoryImplementor sessionFactory) { + SqlAstCreationContext sqlAstCreationContexty) { this.jdbcValuesMapping = jdbcValuesMapping; - this.sessionFactory = sessionFactory; + this.sqlAstCreationContexty = sqlAstCreationContexty; } @Override @@ -256,7 +257,7 @@ public Initializer resolveInitializer( @Override public SqlAstCreationContext getSqlAstCreationContext() { - return sessionFactory; + return sqlAstCreationContexty; } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesMetadata.java b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesMetadata.java index 5febbba58672..4dd21d318651 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesMetadata.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesMetadata.java @@ -31,7 +31,11 @@ public interface JdbcValuesMetadata { /** * Determine the mapping to use for a particular position in the result + * + * @deprecated The existence of this method encourages people to pass around + * references to the SessionFactoryImplementor when they don't need it */ + @Deprecated(since = "7.0", forRemoval = true) default BasicType resolveType( int position, JavaType explicitJavaType, diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/spi/UnknownBasicJavaType.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/spi/UnknownBasicJavaType.java index d9174a6bf32b..1921de67f321 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/spi/UnknownBasicJavaType.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/spi/UnknownBasicJavaType.java @@ -22,6 +22,7 @@ public final class UnknownBasicJavaType extends AbstractJavaType { public UnknownBasicJavaType(Class type) { this( type, type.getTypeName() ); } + public UnknownBasicJavaType(Class type, String typeName) { super( type ); this.typeName = typeName; @@ -42,6 +43,17 @@ public String getTypeName() { return typeName; } + @Override + public Type getJavaType() { + final Type type = super.getJavaType(); + if ( type == null ) { + throw new UnsupportedOperationException( "Unloadable Java type: " + typeName ); + } + else { + return type; + } + } + @Override public JdbcType getRecommendedJdbcType(JdbcTypeIndicators context) { throw new JdbcTypeRecommendationException( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java index e24cee1d1387..324567635bd0 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java @@ -408,7 +408,7 @@ private SelectStatement buildSqlSelectAst( ( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), query.getParameterBindings(), loadQueryInfluencers, - session.getSessionFactory(), + session.getSessionFactory().getSqlTranslationEngine(), true ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java index 4836c5f6ef9e..84cfc6b165bd 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java @@ -406,7 +406,7 @@ private SelectStatement buildSqlSelectAst( ( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), query.getParameterBindings(), loadQueryInfluencers, - session.getSessionFactory(), + session.getSessionFactory().getSqlTranslationEngine(), true ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/criteria/MultiSelectTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/criteria/MultiSelectTests.java index 0b118bcf0254..f3caeb5284bf 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/criteria/MultiSelectTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/criteria/MultiSelectTests.java @@ -33,7 +33,7 @@ public class MultiSelectTests { @Test public void simpleArrayTest(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - final CriteriaBuilder nodeBuilder = session.getFactory().getNodeBuilder(); + final CriteriaBuilder nodeBuilder = session.getFactory().getQueryEngine().getCriteriaBuilder(); final CriteriaQuery criteria = nodeBuilder.createQuery(); final Root root = criteria.from( BasicEntity.class ); @@ -57,7 +57,7 @@ public void simpleArrayTest(SessionFactoryScope scope) { @Test public void multiselectArrayTest(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - final CriteriaBuilder nodeBuilder = session.getFactory().getNodeBuilder(); + final CriteriaBuilder nodeBuilder = session.getFactory().getQueryEngine().getCriteriaBuilder(); final CriteriaQuery criteria = nodeBuilder.createQuery(); final Root root = criteria.from( BasicEntity.class ); @@ -79,7 +79,7 @@ public void multiselectArrayTest(SessionFactoryScope scope) { @Test public void typedArrayTest(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - final CriteriaBuilder nodeBuilder = session.getFactory().getNodeBuilder(); + final CriteriaBuilder nodeBuilder = session.getFactory().getQueryEngine().getCriteriaBuilder(); final CriteriaQuery criteria = nodeBuilder.createQuery(Object[].class); final Root root = criteria.from( BasicEntity.class ); @@ -103,7 +103,7 @@ public void typedArrayTest(SessionFactoryScope scope) { @Test public void simpleTupleTest(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - final CriteriaBuilder nodeBuilder = session.getFactory().getNodeBuilder(); + final CriteriaBuilder nodeBuilder = session.getFactory().getQueryEngine().getCriteriaBuilder(); final CriteriaQuery criteria = nodeBuilder.createTupleQuery(); final Root root = criteria.from( BasicEntity.class ); @@ -127,7 +127,7 @@ public void simpleTupleTest(SessionFactoryScope scope) { @Test public void typedTupleTest(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - final CriteriaBuilder nodeBuilder = session.getFactory().getNodeBuilder(); + final CriteriaBuilder nodeBuilder = session.getFactory().getQueryEngine().getCriteriaBuilder(); final CriteriaQuery criteria = nodeBuilder.createQuery( Tuple.class ); final Root root = criteria.from( BasicEntity.class ); @@ -151,7 +151,7 @@ public void typedTupleTest(SessionFactoryScope scope) { @Test public void multiSelectTupleTest(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - final CriteriaBuilder nodeBuilder = session.getFactory().getNodeBuilder(); + final CriteriaBuilder nodeBuilder = session.getFactory().getQueryEngine().getCriteriaBuilder(); final CriteriaQuery criteria = nodeBuilder.createTupleQuery(); final Root root = criteria.from( BasicEntity.class ); @@ -173,7 +173,7 @@ public void multiSelectTupleTest(SessionFactoryScope scope) { @Test public void arrayTupleTest(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - final CriteriaBuilder nodeBuilder = session.getFactory().getNodeBuilder(); + final CriteriaBuilder nodeBuilder = session.getFactory().getQueryEngine().getCriteriaBuilder(); final CriteriaQuery criteria = nodeBuilder.createTupleQuery(); final Root root = criteria.from( BasicEntity.class ); @@ -197,7 +197,7 @@ public void arrayTupleTest(SessionFactoryScope scope) { @Test public void singleSelectionTupleTest(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - final CriteriaBuilder nodeBuilder = session.getFactory().getNodeBuilder(); + final CriteriaBuilder nodeBuilder = session.getFactory().getQueryEngine().getCriteriaBuilder(); final CriteriaQuery criteria = nodeBuilder.createTupleQuery(); final Root root = criteria.from( BasicEntity.class ); @@ -217,7 +217,7 @@ public void singleSelectionTupleTest(SessionFactoryScope scope) { @Test public void tupleSelectionArrayTest(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - final CriteriaBuilder nodeBuilder = session.getFactory().getNodeBuilder(); + final CriteriaBuilder nodeBuilder = session.getFactory().getQueryEngine().getCriteriaBuilder(); final CriteriaQuery criteria = nodeBuilder.createTupleQuery(); final Root root = criteria.from( BasicEntity.class ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/EntityJoinTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/EntityJoinTest.java index 51779d97bdb8..2d34ba808832 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/EntityJoinTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/EntityJoinTest.java @@ -194,7 +194,7 @@ public void testNoImpliedJoinGeneratedForEqualityComparison(SessionFactoryScope DomainParameterXref.EMPTY, QueryParameterBindingsImpl.EMPTY, new LoadQueryInfluencers( factory ), - factory, + factory.getSqlTranslationEngine(), true ) .translate(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/sqm/BaseSqmUnitTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/sqm/BaseSqmUnitTest.java index 7256cd286c3e..3c9df0c66dd4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/sqm/BaseSqmUnitTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/sqm/BaseSqmUnitTest.java @@ -6,6 +6,8 @@ import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; +import org.hibernate.dialect.Dialect; +import org.hibernate.engine.profile.FetchProfile; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.loader.ast.spi.AfterLoadAction; @@ -91,6 +93,21 @@ public JpaMetamodel getJpaMetamodel() { @Override public Integer getMaximumFetchDepth() { - return sessionFactory().getMaximumFetchDepth(); + return sessionFactory().getSessionFactoryOptions().getMaximumFetchDepth(); + } + + @Override + public boolean isJpaQueryComplianceEnabled() { + return strictJpaCompliance(); + } + + @Override + public Dialect getDialect() { + return sessionFactory().getQueryEngine().getDialect(); + } + + @Override + public FetchProfile getFetchProfile(String name) { + return sessionFactory().getFetchProfile( name ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SmokeTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SmokeTests.java index fdbcb812b356..d353538a1c01 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SmokeTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SmokeTests.java @@ -116,7 +116,7 @@ public void testConvertedHqlInterpretation(SessionFactoryScope scope) { ( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), query.getParameterBindings(), session.getLoadQueryInfluencers(), - scope.getSessionFactory(), + scope.getSessionFactory().getSqlTranslationEngine(), true ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SqlAstHelper.java b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SqlAstHelper.java index 41ad40385bfe..a9a2019917d7 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SqlAstHelper.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SqlAstHelper.java @@ -27,7 +27,7 @@ public static SelectStatement translateHqlSelectQuery(String hql, Class retur hqlQuery.getDomainParameterXref(), query.getParameterBindings(), session.getLoadQueryInfluencers(), - session.getFactory(), + session.getFactory().getSqlTranslationEngine(), true ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/results/AbstractResultTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/results/AbstractResultTests.java index da11575ea7eb..eed86494b8dd 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/results/AbstractResultTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/results/AbstractResultTests.java @@ -35,7 +35,7 @@ protected SelectStatement interpret(String hql, QueryParameterBindings parameter DomainParameterXref.from( sqm ), parameterBindings, new LoadQueryInfluencers( sessionFactory ), - sessionFactory, + sessionFactory.getSqlTranslationEngine(), true ) .translate() diff --git a/hibernate-envers/src/main/java/org/hibernate/envers/function/OrderByFragmentFunction.java b/hibernate-envers/src/main/java/org/hibernate/envers/function/OrderByFragmentFunction.java index f787f3adecd6..6f712bf13df3 100644 --- a/hibernate-envers/src/main/java/org/hibernate/envers/function/OrderByFragmentFunction.java +++ b/hibernate-envers/src/main/java/org/hibernate/envers/function/OrderByFragmentFunction.java @@ -196,11 +196,9 @@ public Expression convertToSqlAst(SqmToSqlAstConverter walker) { final TableGroup tableGroup = ( (FromClauseIndex) walker.getFromClauseAccess() ).findTableGroup( sqmAlias ); - final CollectionPersister collectionDescriptor = walker.getCreationContext() - .getSessionFactory() - .getRuntimeMetamodels() - .getMappingMetamodel() - .findCollectionDescriptor( attributeRole ); + final CollectionPersister collectionDescriptor = + walker.getCreationContext().getMappingMetamodel() + .findCollectionDescriptor( attributeRole ); final PluralAttributeMapping pluralAttribute = collectionDescriptor.getAttributeMapping(); final QuerySpec queryPart = (QuerySpec) ( (SqlAstQueryPartProcessingState) walker.getCurrentProcessingState() ).getInflightQueryPart(); final OrderByFragment fragment; diff --git a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/performance/AbstractEntityManagerTest.java b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/performance/AbstractEntityManagerTest.java index 8a393fb2f38b..035224583d15 100644 --- a/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/performance/AbstractEntityManagerTest.java +++ b/hibernate-envers/src/test/java/org/hibernate/orm/test/envers/performance/AbstractEntityManagerTest.java @@ -4,12 +4,9 @@ */ package org.hibernate.orm.test.envers.performance; -import java.io.IOException; import java.util.Arrays; import java.util.Properties; -import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; -import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Environment; import org.hibernate.dialect.Dialect; @@ -37,8 +34,6 @@ public abstract class AbstractEntityManagerTest extends AbstractEnversTest { public static final Dialect DIALECT = DialectContext.getDialect(); - private EntityManagerFactoryBuilderImpl entityManagerFactoryBuilder; - private StandardServiceRegistryImpl serviceRegistry; private SessionFactoryImplementor emf; private EntityManager entityManager; private AuditReader auditReader; @@ -70,11 +65,11 @@ public void newEntityManager() { } @BeforeClassOnce - public void init() throws IOException { + public void init() { init( true, getAuditStrategy() ); } - protected void init(boolean audited, String auditStrategy) throws IOException { + protected void init(boolean audited, String auditStrategy) { this.audited = audited; Properties configurationProperties = new Properties(); @@ -86,7 +81,7 @@ protected void init(boolean audited, String auditStrategy) throws IOException { configurationProperties.setProperty( AvailableSettings.HBM2DDL_AUTO, "create-drop" ); configurationProperties.setProperty( EnversSettings.USE_REVISION_ENTITY_WITH_NATIVE_ID, "false" ); } - if ( auditStrategy != null && !"".equals( auditStrategy ) ) { + if ( auditStrategy != null && !auditStrategy.isEmpty() ) { configurationProperties.setProperty( "org.hibernate.envers.audit_strategy", auditStrategy ); } @@ -94,17 +89,15 @@ protected void init(boolean audited, String auditStrategy) throws IOException { configurationProperties.put( AvailableSettings.LOADED_CLASSES, Arrays.asList( getAnnotatedClasses() ) ); - entityManagerFactoryBuilder = (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder( - new PersistenceUnitDescriptorAdapter(), - configurationProperties - ); + EntityManagerFactoryBuilderImpl entityManagerFactoryBuilder = + (EntityManagerFactoryBuilderImpl) + Bootstrap.getEntityManagerFactoryBuilder( + new PersistenceUnitDescriptorAdapter(), + configurationProperties + ); emf = entityManagerFactoryBuilder.build().unwrap( SessionFactoryImplementor.class ); - serviceRegistry = (StandardServiceRegistryImpl) emf.getSessionFactory() - .getServiceRegistry() - .getParentServiceRegistry(); - newEntityManager(); } @@ -116,10 +109,6 @@ protected boolean createSchema() { return true; } - private BootstrapServiceRegistryBuilder createBootstrapRegistryBuilder() { - return new BootstrapServiceRegistryBuilder(); - } - @AfterClassOnce public void close() { closeEntityManager(); diff --git a/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentTypeResolver.java b/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentTypeResolver.java index 3593709f9ff6..bcc029518cc4 100644 --- a/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentTypeResolver.java +++ b/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentTypeResolver.java @@ -37,10 +37,7 @@ public class VectorArgumentTypeResolver extends AbstractFunctionArgumentTypeReso } } - return converter.getCreationContext() - .getSessionFactory() - .getTypeConfiguration() - .getBasicTypeRegistry() + return converter.getCreationContext().getTypeConfiguration().getBasicTypeRegistry() .resolve( StandardBasicTypes.VECTOR ); } } diff --git a/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentValidator.java b/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentValidator.java index ee3bc81d01d2..7fc41424d79e 100644 --- a/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentValidator.java +++ b/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentValidator.java @@ -7,14 +7,13 @@ import java.util.List; import org.hibernate.metamodel.model.domain.DomainType; +import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.type.BasicPluralType; -import org.hibernate.type.BasicType; import org.hibernate.type.SqlTypes; -import org.hibernate.type.spi.TypeConfiguration; /** * A {@link ArgumentsValidator} that validates the arguments are all vector types i.e. {@link org.hibernate.type.SqlTypes#VECTOR}. @@ -27,7 +26,7 @@ public class VectorArgumentValidator implements ArgumentsValidator { public void validate( List> arguments, String functionName, - TypeConfiguration typeConfiguration) { + BindingContext bindingContext) { for ( int i = 0; i < arguments.size(); i++ ) { final SqmExpressible expressible = arguments.get( i ).getExpressible(); final DomainType type; @@ -45,18 +44,10 @@ public void validate( } private static boolean isVectorType(SqmExpressible vectorType) { - if ( !( vectorType instanceof BasicPluralType ) ) { - return false; - } - - switch ( ( (BasicType) vectorType ).getJdbcType().getDefaultSqlTypeCode() ) { - case SqlTypes.VECTOR: - case SqlTypes.VECTOR_INT8: - case SqlTypes.VECTOR_FLOAT32: - case SqlTypes.VECTOR_FLOAT64: - return true; - default: - return false; - } + return vectorType instanceof BasicPluralType basicPluralType + && switch ( basicPluralType.getJdbcType().getDefaultSqlTypeCode() ) { + case SqlTypes.VECTOR, SqlTypes.VECTOR_INT8, SqlTypes.VECTOR_FLOAT32, SqlTypes.VECTOR_FLOAT64 -> true; + default -> false; + }; } } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java index 738ab0a6d28a..1ec029187dc5 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java @@ -95,6 +95,8 @@ import org.hibernate.query.named.NamedObjectRepository; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.spi.QueryInterpretationCache; +import org.hibernate.query.sql.internal.SqlTranslationEngineImpl; +import org.hibernate.query.sql.spi.SqlTranslationEngine; import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.function.SqmFunctionRegistry; @@ -139,8 +141,9 @@ */ @SuppressWarnings({"nullness", "initialization"}) public abstract class MockSessionFactory - implements SessionFactoryImplementor, QueryEngine, RuntimeModelCreationContext, MetadataBuildingOptions, - BootstrapContext, MetadataBuildingContext, FunctionContributions, SessionFactoryOptions, JdbcTypeIndicators { + implements SessionFactoryImplementor, SessionFactoryOptions, QueryEngine, FunctionContributions, + MetadataBuildingOptions, MetadataBuildingContext, RuntimeModelCreationContext, BootstrapContext, + JdbcTypeIndicators { private static final BasicTypeImpl OBJECT_BASIC_TYPE = new BasicTypeImpl<>(new UnknownBasicJavaType<>(Object.class), ObjectJdbcType.INSTANCE); @@ -158,6 +161,7 @@ public abstract class MockSessionFactory private final MetadataContext metadataContext; private final NodeBuilder nodeBuilder; + private final SqlTranslationEngine sqlTranslationEngine; private final ClassLoaderServiceImpl classLoaderService; @@ -234,6 +238,8 @@ public Class classForName(String className) { typeConfiguration.scope((SessionFactoryImplementor) this); nodeBuilder = new SqmCriteriaNodeBuilder("", "", this, this, this); + + sqlTranslationEngine = new SqlTranslationEngineImpl(this, typeConfiguration, emptyMap() ); } @Override @@ -377,12 +383,6 @@ public StandardServiceRegistryImpl getServiceRegistry() { return serviceRegistry; } - @Override - public Class classForName(String className) { - return serviceRegistry.requireService( ClassLoaderService.class ) - .classForName( className ); - } - @Override public JdbcServices getJdbcServices() { return MockJdbcServicesInitiator.jdbcServices; @@ -502,7 +502,7 @@ public NamedObjectRepository getNamedObjectRepository() { @Override public HqlTranslator getHqlTranslator() { - return new StandardHqlTranslator(MockSessionFactory.this, new SqmCreationOptions() {}); + return new StandardHqlTranslator(nodeBuilder, new SqmCreationOptions() {}); } @Override @@ -515,6 +515,11 @@ public QueryEngine getQueryEngine() { return this; } + @Override + public SqlTranslationEngine getSqlTranslationEngine() { + return sqlTranslationEngine; + } + @Override public JpaMetamodelImplementor getJpaMetamodel() { return metamodel.getJpaMetamodel(); @@ -1041,7 +1046,7 @@ public PersistentAttribute findDeclaredAttribute(String name) { protected abstract String getJpaEntityName(String typeName); - private AbstractAttribute createAttribute(String name, String entityName, Type type, ManagedDomainType owner) { + private AbstractAttribute createAttribute(String name, String entityName, Type type, ManagedDomainType owner) { if (type==null) { throw new UnsupportedOperationException(entityName + "." + name); } @@ -1127,11 +1132,11 @@ else if ( elementType instanceof DomainType domainType ) { } } - private AbstractPluralAttribute createPluralAttribute( + private AbstractPluralAttribute createPluralAttribute( CollectionType collectionType, String entityName, String name, - ManagedDomainType owner) { + ManagedDomainType owner) { final Property property = new Property(); property.setName(name); final JavaType collectionJavaType = @@ -1201,11 +1206,11 @@ private AbstractPluralAttribute createPluralAttribute( }; } - private EmbeddableTypeImpl createEmbeddableDomainType(String entityName, CompositeType compositeType, ManagedDomainType owner) { - final JavaType javaType = new UnknownBasicJavaType<>(Object.class, compositeType.getReturnedClassName()); + private EmbeddableTypeImpl createEmbeddableDomainType(String entityName, CompositeType compositeType, ManagedDomainType owner) { + final JavaType javaType = new UnknownBasicJavaType<>(null, compositeType.getReturnedClassName()); return new EmbeddableTypeImpl<>( javaType, null, null, true, metamodel.getJpaMetamodel() ) { @Override - public PersistentAttribute findAttribute(String name) { + public PersistentAttribute findAttribute(String name) { return createAttribute( name, entityName, diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/Validation.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/Validation.java index 3f83888723fb..a35b0bd42d6d 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/Validation.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/Validation.java @@ -21,6 +21,7 @@ import org.hibernate.query.sqm.EntityTypeException; import org.hibernate.query.sqm.PathElementException; import org.hibernate.query.sqm.TerminalPathException; +import org.hibernate.query.sqm.spi.SqmCreationContext; import org.hibernate.query.sqm.tree.SqmStatement; import org.hibernate.type.descriptor.java.spi.JdbcTypeRecommendationException; @@ -103,17 +104,18 @@ public interface Handler extends ANTLRErrorListener { private static SemanticQueryBuilder createSemanticQueryBuilder( @Nullable TypeMirror returnType, String hql, SessionFactoryImplementor factory) { + final SqmCreationContext context = factory.getQueryEngine().getCriteriaBuilder(); if ( returnType != null && returnType.getKind() == TypeKind.DECLARED ) { final DeclaredType declaredType = (DeclaredType) returnType; final TypeElement typeElement = (TypeElement) declaredType.asElement(); final String typeName = typeElement.getQualifiedName().toString(); final String shortName = typeElement.getSimpleName().toString(); return isEntity( typeElement ) - ? new SemanticQueryBuilder<>( typeName, shortName, getHibernateEntityName(typeElement), CREATION_OPTIONS, factory, hql ) - : new SemanticQueryBuilder<>( typeName, shortName, Object[].class, CREATION_OPTIONS, factory, hql ); + ? new SemanticQueryBuilder<>( typeName, shortName, getHibernateEntityName(typeElement), CREATION_OPTIONS, context, hql ) + : new SemanticQueryBuilder<>( typeName, shortName, Object[].class, CREATION_OPTIONS, context, hql ); } else { - return new SemanticQueryBuilder<>( Object[].class, CREATION_OPTIONS, factory, hql ); + return new SemanticQueryBuilder<>( Object[].class, CREATION_OPTIONS, context, hql ); } }