diff --git a/hibernate-core/src/main/java/org/hibernate/internal/util/cache/InternalCache.java b/hibernate-core/src/main/java/org/hibernate/internal/util/cache/InternalCache.java index 02d1142d74d0..1cd6a41cc8f9 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/util/cache/InternalCache.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/util/cache/InternalCache.java @@ -27,16 +27,12 @@ public interface InternalCache { /** * Attempt to read from the cache. Will return null on cache miss. * It would typically be better to use {@link #computeIfAbsent(Object, Function)} instead. - * @param key - * @return */ V get(K key); /** * Stores a key/value pair into the cache. Storage is not guaranteed, as the implementation * has liberty to cap internal storage or use various eviction strategies. - * @param key - * @param value */ void put(K key, V value); @@ -55,7 +51,6 @@ public interface InternalCache { * the general pattern of "try to read, or produce a value and then cache it" but avoiding * efficiency issues that would be caused by accessing the cache multiple times, not least * potentially a cache stampede, and concurrent need for generating the same value. - * @param key * @param mappingFunction This function will be invoked to produce the value, and store it, * if a matching existing value couldn't be loaded from the cache. * @return Either the existing value, or the return from the provided function. diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/NamedObjectRepositoryImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/NamedObjectRepositoryImpl.java index c80f0470880d..f4f1f89f7ea7 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/NamedObjectRepositoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/NamedObjectRepositoryImpl.java @@ -15,9 +15,6 @@ import org.hibernate.HibernateException; import org.hibernate.QueryException; import org.hibernate.boot.Metadata; -import org.hibernate.boot.query.NamedHqlQueryDefinition; -import org.hibernate.boot.query.NamedNativeQueryDefinition; -import org.hibernate.boot.query.NamedProcedureCallDefinition; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.procedure.spi.NamedCallableQueryMemento; @@ -33,7 +30,6 @@ import org.hibernate.query.named.NamedQueryMemento; import org.hibernate.query.named.NamedResultSetMappingMemento; import org.hibernate.query.spi.QueryEngine; -import org.hibernate.query.spi.QueryInterpretationCache; import org.hibernate.query.sql.spi.NamedNativeQueryMemento; import org.hibernate.query.sqm.UnknownEntityException; import org.hibernate.query.sqm.UnknownPathException; @@ -70,13 +66,14 @@ public NamedObjectRepositoryImpl( @Override @SuppressWarnings("unchecked") public Map> getNamedQueries(Class resultType) { - final Map> namedQueries = new HashMap<>( sqmMementoMap.size() + sqlMementoMap.size() ); - for ( Map.Entry> entry : sqmMementoMap.entrySet() ) { + final Map> namedQueries = + new HashMap<>( sqmMementoMap.size() + sqlMementoMap.size() ); + for ( var entry : sqmMementoMap.entrySet() ) { if ( resultType == entry.getValue().getResultType() ) { namedQueries.put( entry.getKey(), (TypedQueryReference) entry.getValue() ); } } - for ( Map.Entry> entry : sqlMementoMap.entrySet() ) { + for ( var entry : sqlMementoMap.entrySet() ) { if ( resultType == entry.getValue().getResultType() ) { namedQueries.put( entry.getKey(), (TypedQueryReference) entry.getValue() ); } @@ -106,7 +103,6 @@ public void registerNamedQuery(String name, Query query) { if ( queryImplementor != null ) { if ( queryImplementor instanceof NativeQueryImplementor nativeQueryImplementor ) { registerNativeQueryMemento( name, nativeQueryImplementor.toMemento( name ) ); - } else if ( queryImplementor instanceof SqmQueryImplementor sqmQueryImplementor ) { registerSqmQueryMemento( name, sqmQueryImplementor.toMemento( name ) ); @@ -127,12 +123,12 @@ else if ( queryImplementor instanceof SqmQueryImplementor sqmQueryImplementor @Override public TypedQueryReference registerNamedQuery(String name, TypedQuery query) { if ( query instanceof NativeQueryImplementor nativeQueryImplementor ) { - final NamedNativeQueryMemento memento = nativeQueryImplementor.toMemento( name ); + final var memento = nativeQueryImplementor.toMemento( name ); registerNativeQueryMemento( name, memento ); return memento; } else if ( query instanceof SqmQueryImplementor sqmQueryImplementor ) { - final NamedSqmQueryMemento memento = sqmQueryImplementor.toMemento( name ); + final var memento = sqmQueryImplementor.toMemento( name ); registerSqmQueryMemento( name, memento ); return memento; } @@ -238,23 +234,23 @@ public NamedQueryMemento resolve( if ( namedQuery != null ) { return namedQuery; } - final NamedHqlQueryDefinition namedHqlQueryDefinition = bootMetamodel.getNamedHqlQueryMapping( registrationName ); + final var namedHqlQueryDefinition = bootMetamodel.getNamedHqlQueryMapping( registrationName ); if ( namedHqlQueryDefinition != null ) { - final NamedSqmQueryMemento resolved = namedHqlQueryDefinition.resolve( sessionFactory ); - sqmMementoMap.put( namedHqlQueryDefinition.getRegistrationName(), resolved ); - return resolved; + final var memento = namedHqlQueryDefinition.resolve( sessionFactory ); + sqmMementoMap.put( namedHqlQueryDefinition.getRegistrationName(), memento ); + return memento; } - final NamedNativeQueryDefinition namedNativeQueryDefinition = bootMetamodel.getNamedNativeQueryMapping( registrationName ); + final var namedNativeQueryDefinition = bootMetamodel.getNamedNativeQueryMapping( registrationName ); if ( namedNativeQueryDefinition != null ) { - final NamedNativeQueryMemento resolved = namedNativeQueryDefinition.resolve( sessionFactory ); - sqlMementoMap.put( namedNativeQueryDefinition.getRegistrationName(), resolved ); - return resolved; + final var memento = namedNativeQueryDefinition.resolve( sessionFactory ); + sqlMementoMap.put( namedNativeQueryDefinition.getRegistrationName(), memento ); + return memento; } - final NamedProcedureCallDefinition namedCallableQueryDefinition = bootMetamodel.getNamedProcedureCallMapping( registrationName ); + final var namedCallableQueryDefinition = bootMetamodel.getNamedProcedureCallMapping( registrationName ); if ( namedCallableQueryDefinition != null ) { - final NamedCallableQueryMemento resolved = namedCallableQueryDefinition.resolve( sessionFactory ); - callableMementoMap.put( namedCallableQueryDefinition.getRegistrationName(), resolved ); - return resolved; + final var memento = namedCallableQueryDefinition.resolve( sessionFactory ); + callableMementoMap.put( namedCallableQueryDefinition.getRegistrationName(), memento ); + return memento; } return null; } @@ -262,31 +258,27 @@ public NamedQueryMemento resolve( @Override public void prepare(SessionFactoryImplementor sessionFactory, Metadata bootMetamodel) { bootMetamodel.visitNamedHqlQueryDefinitions( - namedHqlQueryDefinition -> { - final NamedSqmQueryMemento resolved = namedHqlQueryDefinition.resolve( sessionFactory ); - sqmMementoMap.put( namedHqlQueryDefinition.getRegistrationName(), resolved ); - } + namedHqlQueryDefinition -> + sqmMementoMap.put( namedHqlQueryDefinition.getRegistrationName(), + namedHqlQueryDefinition.resolve( sessionFactory ) ) ); bootMetamodel.visitNamedNativeQueryDefinitions( - namedNativeQueryDefinition -> { - final NamedNativeQueryMemento resolved = namedNativeQueryDefinition.resolve( sessionFactory ); - sqlMementoMap.put( namedNativeQueryDefinition.getRegistrationName(), resolved ); - } + namedNativeQueryDefinition -> + sqlMementoMap.put( namedNativeQueryDefinition.getRegistrationName(), + namedNativeQueryDefinition.resolve( sessionFactory ) ) ); bootMetamodel.visitNamedResultSetMappingDefinition( - namedResultSetMappingDefinition -> { - final NamedResultSetMappingMemento resolved = namedResultSetMappingDefinition.resolve( () -> sessionFactory ); - resultSetMappingMementoMap.put( namedResultSetMappingDefinition.getRegistrationName(), resolved ); - } + namedResultSetMappingDefinition -> + resultSetMappingMementoMap.put( namedResultSetMappingDefinition.getRegistrationName(), + namedResultSetMappingDefinition.resolve( () -> sessionFactory ) ) ); bootMetamodel.visitNamedProcedureCallDefinition( - namedProcedureCallDefinition -> { - final NamedCallableQueryMemento resolved = namedProcedureCallDefinition.resolve( sessionFactory ); - callableMementoMap.put( namedProcedureCallDefinition.getRegistrationName(), resolved ); - } + namedProcedureCallDefinition -> + callableMementoMap.put( namedProcedureCallDefinition.getRegistrationName(), + namedProcedureCallDefinition.resolve( sessionFactory ) ) ); } @@ -297,18 +289,17 @@ public void prepare(SessionFactoryImplementor sessionFactory, Metadata bootMetam @Override public void validateNamedQueries(QueryEngine queryEngine) { - final Map errors = checkNamedQueries( queryEngine ); + final var errors = checkNamedQueries( queryEngine ); if ( !errors.isEmpty() ) { int i = 0; final StringBuilder failingQueries = new StringBuilder( "Errors in named queries: " ); - for ( Map.Entry entry : errors.entrySet() ) { + for ( var entry : errors.entrySet() ) { QUERY_MESSAGE_LOGGER.namedQueryError( entry.getKey(), entry.getValue() ); failingQueries.append( "\n" ) .append(" [").append(++i).append("] Error in query named '").append( entry.getKey() ).append("'") .append(": ").append( entry.getValue().getMessage() ); } - final NamedQueryValidationException exception = - new NamedQueryValidationException( failingQueries.toString(), errors ); + final var exception = new NamedQueryValidationException( failingQueries.toString(), errors ); errors.values().forEach( exception::addSuppressed ); throw exception; } @@ -318,20 +309,17 @@ public void validateNamedQueries(QueryEngine queryEngine) { public Map checkNamedQueries(QueryEngine queryEngine) { Map errors = new HashMap<>(); - final QueryInterpretationCache interpretationCache = queryEngine.getInterpretationCache(); + final var interpretationCache = queryEngine.getInterpretationCache(); + final var hqlTranslator = queryEngine.getHqlTranslator(); // Check named HQL queries log.tracef( "Checking %s named HQL queries", sqmMementoMap.size() ); - for ( NamedSqmQueryMemento hqlMemento : sqmMementoMap.values() ) { + for ( var hqlMemento : sqmMementoMap.values() ) { final String queryString = hqlMemento.getHqlString(); final String registrationName = hqlMemento.getRegistrationName(); try { log.tracef( "Checking named HQL query: %s", registrationName ); - interpretationCache.resolveHqlInterpretation( - queryString, - null, - queryEngine.getHqlTranslator() - ); + interpretationCache.resolveHqlInterpretation( queryString, null, hqlTranslator ); } catch ( QueryException e ) { errors.put( registrationName, e ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/ParameterMetadataImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/ParameterMetadataImpl.java index ac97a32bd78a..8fff8455d456 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/ParameterMetadataImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/ParameterMetadataImpl.java @@ -31,6 +31,7 @@ import jakarta.persistence.Parameter; import org.checkerframework.checker.nullness.qual.Nullable; +import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; import static java.util.Collections.unmodifiableSet; import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty; @@ -65,7 +66,7 @@ public ParameterMetadataImpl(Map, List> tempQueryParametersByPosition = null; // if we have any ordinal parameters, make sure the numbers // start with 1 and are contiguous - for ( QueryParameterImplementor queryParameter : queryParameters.keySet() ) { + for ( var queryParameter : queryParameters.keySet() ) { if ( queryParameter.getPosition() != null ) { if ( tempQueryParametersByPosition == null ) { tempQueryParametersByPosition = new HashMap<>(); @@ -96,24 +97,24 @@ public ParameterMetadataImpl( Map> tempQueryParametersByName = null; Map> tempQueryParametersByPosition = null; if ( positionalQueryParameters != null ) { - for ( QueryParameterImplementor value : positionalQueryParameters.values() ) { - this.queryParameters.put( value, Collections.emptyList() ); + for ( var queryParameter : positionalQueryParameters.values() ) { + this.queryParameters.put( queryParameter, emptyList() ); if ( tempQueryParametersByPosition == null ) { tempQueryParametersByPosition = new HashMap<>(); } - tempQueryParametersByPosition.put( value.getPosition(), value ); + tempQueryParametersByPosition.put( queryParameter.getPosition(), queryParameter ); } if ( tempQueryParametersByPosition != null ) { verifyOrdinalParamLabels( tempQueryParametersByPosition.keySet() ); } } if ( namedQueryParameters != null ) { - for ( QueryParameterImplementor value : namedQueryParameters.values() ) { + for ( var queryParameter : namedQueryParameters.values() ) { if ( tempQueryParametersByName == null ) { tempQueryParametersByName = new HashMap<>(); } - this.queryParameters.put( value, Collections.emptyList() ); - tempQueryParametersByName.put( value.getName(), value ); + this.queryParameters.put( queryParameter, emptyList() ); + tempQueryParametersByName.put( queryParameter.getName(), queryParameter ); } } this.queryParametersByPosition = tempQueryParametersByPosition; @@ -176,13 +177,12 @@ public int getParameterCount() { @Override public BindableType getInferredParameterType(QueryParameter parameter) { - final List> sqmParameters = - queryParameters.get( (QueryParameterImplementor) parameter ); + final var sqmParameters = queryParameters.get( (QueryParameterImplementor) parameter ); if ( sqmParameters == null || sqmParameters.isEmpty() ) { return null; } - for ( SqmParameter sqmParameter : sqmParameters ) { - final BindableType nodeType = sqmParameter.getNodeType(); + for ( var sqmParameter : sqmParameters ) { + final var nodeType = sqmParameter.getNodeType(); if ( nodeType != null ) { //noinspection unchecked return (BindableType) nodeType; @@ -209,7 +209,7 @@ public Set> getRegistrations() { @Override public boolean hasAnyMatching(Predicate> filter) { - for ( QueryParameterImplementor queryParameter : queryParameters.keySet() ) { + for ( var queryParameter : queryParameters.keySet() ) { if ( filter.test( queryParameter ) ) { return true; } @@ -255,7 +255,7 @@ public QueryParameterImplementor findQueryParameter(String name) { @Override public QueryParameterImplementor getQueryParameter(String name) { - final QueryParameterImplementor parameter = findQueryParameter( name ); + final var parameter = findQueryParameter( name ); if ( parameter != null ) { return parameter; } @@ -293,7 +293,7 @@ public QueryParameterImplementor findQueryParameter(int positionLabel) { @Override public QueryParameterImplementor getQueryParameter(int positionLabel) { - final QueryParameterImplementor queryParameter = findQueryParameter( positionLabel ); + final var queryParameter = findQueryParameter( positionLabel ); if ( queryParameter != null ) { return queryParameter; } 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 e9a6b62b471f..dff775c74ae2 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 @@ -8,7 +8,6 @@ import org.hibernate.boot.model.FunctionContributor; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.spi.MetadataImplementor; -import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.query.spi.NativeQueryInterpreter; @@ -20,7 +19,6 @@ import org.hibernate.type.BindingContext; import org.hibernate.query.hql.HqlTranslator; import org.hibernate.query.hql.internal.StandardHqlTranslator; -import org.hibernate.query.hql.spi.SqmCreationOptions; import org.hibernate.query.named.NamedObjectRepository; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.spi.QueryEngineOptions; @@ -38,11 +36,12 @@ import org.jboss.logging.Logger; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; import static java.util.Comparator.comparingInt; +import static org.hibernate.cfg.QuerySettings.QUERY_PLAN_CACHE_ENABLED; +import static org.hibernate.cfg.QuerySettings.QUERY_PLAN_CACHE_MAX_SIZE; /** * Aggregation and encapsulation of the components Hibernate uses @@ -99,7 +98,7 @@ private static HqlTranslator resolveHqlTranslator( QueryEngineOptions options, Dialect dialect, SqmCreationContext sqmCreationContext) { - final SqmCreationOptions sqmCreationOptions = new SqmCreationOptionsStandard( options ); + final var sqmCreationOptions = new SqmCreationOptionsStandard( options ); if ( options.getCustomHqlTranslator() != null ) { return options.getCustomHqlTranslator(); } @@ -130,11 +129,11 @@ private static SqmFunctionRegistry createFunctionRegistry( MetadataImplementor metadata, QueryEngineOptions queryEngineOptions, Dialect dialect) { - final SqmFunctionRegistry sqmFunctionRegistry = metadata.getFunctionRegistry(); + final var sqmFunctionRegistry = metadata.getFunctionRegistry(); queryEngineOptions.getCustomSqlFunctionMap().forEach( sqmFunctionRegistry::register ); - final SqmFunctionRegistry customSqmFunctionRegistry = queryEngineOptions.getCustomSqmFunctionRegistry(); + final var customSqmFunctionRegistry = queryEngineOptions.getCustomSqmFunctionRegistry(); if ( customSqmFunctionRegistry != null ) { customSqmFunctionRegistry.overlay( sqmFunctionRegistry ); } @@ -142,7 +141,7 @@ private static SqmFunctionRegistry createFunctionRegistry( //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 ) ) { + for ( var contributor : sortedFunctionContributors( serviceRegistry ) ) { contributor.contributeFunctions( functionContributions ); } @@ -161,7 +160,7 @@ private static SqmFunctionRegistry createFunctionRegistry( } private static List sortedFunctionContributors(ServiceRegistry serviceRegistry) { - final Collection functionContributors = + final var functionContributors = serviceRegistry.requireService(ClassLoaderService.class) .loadJavaServices(FunctionContributor.class); final List contributors = new ArrayList<>( functionContributors ); @@ -175,36 +174,37 @@ private static List sortedFunctionContributors(ServiceRegis public static QueryInterpretationCache buildInterpretationCache( ServiceRegistry serviceRegistry, Map properties) { final boolean useCache = ConfigurationHelper.getBoolean( - AvailableSettings.QUERY_PLAN_CACHE_ENABLED, + QUERY_PLAN_CACHE_ENABLED, properties, // enabled by default true ); final Integer explicitMaxPlanSize = ConfigurationHelper.getInteger( - AvailableSettings.QUERY_PLAN_CACHE_MAX_SIZE, + QUERY_PLAN_CACHE_MAX_SIZE, properties ); //Let's avoid some confusion and check settings consistency: - final int appliedMaxPlanSize = explicitMaxPlanSize == null - ? QueryEngine.DEFAULT_QUERY_PLAN_MAX_COUNT - : explicitMaxPlanSize; + final int appliedMaxPlanSize = + explicitMaxPlanSize == null + ? QueryEngine.DEFAULT_QUERY_PLAN_MAX_COUNT + : explicitMaxPlanSize; if ( !useCache && explicitMaxPlanSize != null && appliedMaxPlanSize > 0 ) { - throw new ConfigurationException( "Inconsistent configuration: '" + AvailableSettings.QUERY_PLAN_CACHE_MAX_SIZE + "' can only be set to a greater than zero value when '" + AvailableSettings.QUERY_PLAN_CACHE_ENABLED + "' is enabled" ); + throw new ConfigurationException( "Inconsistent configuration: '" + QUERY_PLAN_CACHE_MAX_SIZE + + "' can only be set to a greater than zero value when '" + + QUERY_PLAN_CACHE_ENABLED + "' is enabled" ); } if ( appliedMaxPlanSize < 0 ) { - throw new ConfigurationException( "Inconsistent configuration: '" + AvailableSettings.QUERY_PLAN_CACHE_MAX_SIZE + "' can't be set to a negative value. To disable the query plan cache set '" + AvailableSettings.QUERY_PLAN_CACHE_ENABLED + "' to 'false'" ); + throw new ConfigurationException( "Inconsistent configuration: '" + QUERY_PLAN_CACHE_MAX_SIZE + + "' can't be set to a negative value. To disable the query plan cache set '" + + QUERY_PLAN_CACHE_ENABLED + "' to 'false'" ); } - if ( useCache ) { - return new QueryInterpretationCacheStandardImpl( appliedMaxPlanSize, serviceRegistry ); - } - else { - // disabled - return new QueryInterpretationCacheDisabledImpl( serviceRegistry ); - } + return useCache + ? new QueryInterpretationCacheStandardImpl( appliedMaxPlanSize, serviceRegistry ) + : new QueryInterpretationCacheDisabledImpl( serviceRegistry ); // disabled } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryInterpretationCacheDisabledImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryInterpretationCacheDisabledImpl.java index 961d56ba3485..aeb038779d7f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryInterpretationCacheDisabledImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryInterpretationCacheDisabledImpl.java @@ -53,7 +53,7 @@ private StatisticsImplementor getStatistics() { @Override public SelectQueryPlan resolveSelectQueryPlan(Key key, Supplier> creator) { - final StatisticsImplementor statistics = getStatistics(); + final var statistics = getStatistics(); if ( statistics.isStatisticsEnabled() ) { statistics.queryPlanCacheMiss( key.getQueryString() ); } @@ -62,7 +62,7 @@ public SelectQueryPlan resolveSelectQueryPlan(Key key, Supplier SelectQueryPlan resolveSelectQueryPlan(K key, Function> creator) { - final StatisticsImplementor statistics = getStatistics(); + final var statistics = getStatistics(); if ( statistics.isStatisticsEnabled() ) { statistics.queryPlanCacheMiss( key.getQueryString() ); } @@ -81,11 +81,11 @@ public void cacheNonSelectQueryPlan(Key key, NonSelectQueryPlan plan) { @Override public HqlInterpretation resolveHqlInterpretation( String queryString, Class expectedResultType, HqlTranslator translator) { - final StatisticsImplementor statistics = getStatistics(); + final var statistics = getStatistics(); final boolean stats = statistics.isStatisticsEnabled(); final long startTime = stats ? System.nanoTime() : 0L; - final SqmStatement sqmStatement = translator.translate( queryString, expectedResultType ); + final var sqmStatement = translator.translate( queryString, expectedResultType ); final DomainParameterXref domainParameterXref; final ParameterMetadataImplementor parameterMetadata; @@ -122,7 +122,6 @@ public DomainParameterXref getDomainParameterXref() { @Override public void validateResultType(Class resultType) { - assert sqmStatement instanceof SqmSelectStatement; ( (SqmSelectStatement) sqmStatement ).validateResultType( resultType ); } }; diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryInterpretationCacheStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryInterpretationCacheStandardImpl.java index 2ea8121b460a..d179c3c9ec16 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryInterpretationCacheStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryInterpretationCacheStandardImpl.java @@ -21,7 +21,6 @@ import org.hibernate.query.spi.SimpleHqlInterpretationImpl; import org.hibernate.query.sql.spi.ParameterInterpretation; import org.hibernate.query.sqm.internal.DomainParameterXref; -import org.hibernate.query.sqm.tree.SqmStatement; import org.hibernate.service.ServiceRegistry; import org.hibernate.stat.spi.StatisticsImplementor; @@ -48,7 +47,7 @@ public class QueryInterpretationCacheStandardImpl implements QueryInterpretation public QueryInterpretationCacheStandardImpl(int maxQueryPlanCount, ServiceRegistry serviceRegistry) { log.tracef( "Starting query interpretation cache (size %s)", maxQueryPlanCount ); - final InternalCacheFactory cacheFactory = serviceRegistry.requireService( InternalCacheFactory.class ); + final var cacheFactory = serviceRegistry.requireService( InternalCacheFactory.class ); this.queryPlanCache = cacheFactory.createInternalCache( maxQueryPlanCount ); this.hqlInterpretationCache = cacheFactory.createInternalCache( maxQueryPlanCount ); this.nativeQueryParamCache = cacheFactory.createInternalCache( maxQueryPlanCount ); @@ -84,11 +83,11 @@ public SelectQueryPlan resolveSelectQueryPlan( K key, Function> creator) { log.tracef( "Resolving cached query plan for [%s]", key ); - final StatisticsImplementor statistics = getStatistics(); + final var statistics = getStatistics(); final boolean stats = statistics.isStatisticsEnabled(); @SuppressWarnings("unchecked") - final SelectQueryPlan cached = (SelectQueryPlan) queryPlanCache.get( key ); + final var cached = (SelectQueryPlan) queryPlanCache.get( key ); if ( cached != null ) { if ( stats ) { statistics.queryPlanCacheHit( key.getQueryString() ); @@ -96,7 +95,7 @@ public SelectQueryPlan resolveSelectQueryPlan( return cached; } - final SelectQueryPlan plan = creator.apply( key ); + final var plan = creator.apply( key ); queryPlanCache.put( key.prepareForStore(), plan ); if ( stats ) { statistics.queryPlanCacheMiss( key.getQueryString() ); @@ -119,13 +118,13 @@ public HqlInterpretation resolveHqlInterpretation( Class expectedResultType, HqlTranslator translator) { log.tracef( "Resolving HQL interpretation for [%s]", queryString ); - final StatisticsImplementor statistics = getStatistics(); + final var statistics = getStatistics(); final Object cacheKey = expectedResultType != null ? new HqlInterpretationCacheKey( queryString, expectedResultType ) : queryString; - final HqlInterpretation existing = hqlInterpretationCache.get( cacheKey ); + final var existing = hqlInterpretationCache.get( cacheKey ); if ( existing != null ) { if ( statistics.isStatisticsEnabled() ) { statistics.queryPlanCacheHit( queryString ); @@ -134,7 +133,7 @@ public HqlInterpretation resolveHqlInterpretation( return (HqlInterpretation) existing; } else if ( expectedResultType != null ) { - final HqlInterpretation existingQueryOnly = hqlInterpretationCache.get( queryString ); + final var existingQueryOnly = hqlInterpretationCache.get( queryString ); if ( existingQueryOnly != null ) { if ( statistics.isStatisticsEnabled() ) { statistics.queryPlanCacheHit( queryString ); @@ -144,7 +143,7 @@ else if ( expectedResultType != null ) { } } - final HqlInterpretation hqlInterpretation = + final var hqlInterpretation = createHqlInterpretation( queryString, expectedResultType, translator, statistics ); hqlInterpretationCache.put( cacheKey, hqlInterpretation ); return hqlInterpretation; @@ -163,10 +162,10 @@ protected static HqlInterpretation createHqlInterpretation( final boolean stats = statistics.isStatisticsEnabled(); final long startTime = stats ? System.nanoTime() : 0L; - final SqmStatement sqmStatement = translator.translate( queryString, expectedResultType ); + final var sqmStatement = translator.translate( queryString, expectedResultType ); + final ParameterMetadataImplementor parameterMetadata; final DomainParameterXref domainParameterXref; - if ( sqmStatement.getSqmParameters().isEmpty() ) { domainParameterXref = DomainParameterXref.EMPTY; parameterMetadata = ParameterMetadataImpl.EMPTY; @@ -211,5 +210,4 @@ public void close() { */ private record HqlInterpretationCacheKey(String queryString, Class expectedResultType) { } - } 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 a73b49066db7..6a0181416d10 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 @@ -19,7 +19,6 @@ 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; import org.hibernate.type.descriptor.java.JavaTypeHelper; @@ -254,9 +253,7 @@ private void setExplicitTemporalPrecision(TemporalType precision) { } private JavaType determineJavaType(BindableType bindType) { - final SqmExpressible sqmExpressible = getCriteriaBuilder().resolveExpressible( bindType ); - assert sqmExpressible != null; - return sqmExpressible.getExpressibleJavaType(); + return getCriteriaBuilder().resolveExpressible( bindType ).getExpressibleJavaType(); } @Override @@ -338,9 +335,8 @@ private Object coerce(T value, BindableType parameterType) { return null; } else { - final SqmExpressible sqmExpressible = getCriteriaBuilder().resolveExpressible( parameterType ); - assert sqmExpressible != null; - return sqmExpressible.getExpressibleJavaType().coerce( value, this ); + return getCriteriaBuilder().resolveExpressible( parameterType ) + .getExpressibleJavaType().coerce( value, this ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingsImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingsImpl.java index 2c4d5e031bf7..7e75dac8041f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingsImpl.java @@ -7,32 +7,23 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.function.BiConsumer; -import org.hibernate.Filter; import org.hibernate.Incubating; import org.hibernate.QueryParameterException; import org.hibernate.cache.MutableCacheKeyBuilder; import org.hibernate.cache.spi.QueryKey; -import org.hibernate.engine.spi.FilterDefinition; -import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.FilterImpl; -import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.MappingModelExpressible; -import org.hibernate.type.BindableType; import org.hibernate.query.QueryParameter; import org.hibernate.query.spi.ParameterMetadataImplementor; import org.hibernate.query.spi.QueryParameterBinding; import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.query.spi.QueryParameterImplementor; -import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.JavaTypedExpressible; import org.hibernate.type.spi.TypeConfiguration; @@ -71,14 +62,14 @@ private QueryParameterBindingsImpl( SessionFactoryImplementor sessionFactory, ParameterMetadataImplementor parameterMetadata) { this.parameterMetadata = parameterMetadata; - final Set> queryParameters = parameterMetadata.getRegistrations(); + final var queryParameters = parameterMetadata.getRegistrations(); this.parameterBindingMap = linkedMapOfSize( queryParameters.size() ); this.parameterBindingMapByNameOrPosition = mapOfSize( queryParameters.size() ); - for ( QueryParameter queryParameter : queryParameters ) { + for ( var queryParameter : queryParameters ) { parameterBindingMap.put( queryParameter, createBinding( sessionFactory, parameterMetadata, queryParameter ) ); } - for ( Map.Entry, QueryParameterBinding> entry : parameterBindingMap.entrySet() ) { - final QueryParameter queryParameter = entry.getKey(); + for ( var entry : parameterBindingMap.entrySet() ) { + final var queryParameter = entry.getKey(); if ( queryParameter.isNamed() ) { parameterBindingMapByNameOrPosition.put( queryParameter.getName(), entry.getValue() ); } @@ -98,10 +89,10 @@ private QueryParameterBindingsImpl(QueryParameterBindingsImpl original, SessionF this.parameterMetadata = original.parameterMetadata; this.parameterBindingMap = linkedMapOfSize( original.parameterBindingMap.size() ); this.parameterBindingMapByNameOrPosition = mapOfSize( original.parameterBindingMapByNameOrPosition.size() ); - for ( Map.Entry, QueryParameterBinding> entry : original.parameterBindingMap.entrySet() ) { + for ( var entry : original.parameterBindingMap.entrySet() ) { parameterBindingMap.put( entry.getKey(), createBinding( sessionFactory, entry.getValue() ) ); } - for ( Map.Entry, QueryParameterBinding> entry : parameterBindingMap.entrySet() ) { + for ( var entry : parameterBindingMap.entrySet() ) { final QueryParameter queryParameter = entry.getKey(); if ( queryParameter.isNamed() ) { parameterBindingMapByNameOrPosition.put( queryParameter.getName(), entry.getValue() ); @@ -128,7 +119,7 @@ public boolean isBound(QueryParameterImplementor parameter) { @Override public

QueryParameterBinding

getBinding(QueryParameterImplementor

parameter) { - final QueryParameterBinding binding = parameterBindingMap.get( parameter ); + final var binding = parameterBindingMap.get( parameter ); if ( binding == null ) { throw new IllegalArgumentException( "Cannot create binding for parameter reference [" + parameter + "] - reference is not a parameter of this query" @@ -140,7 +131,7 @@ public

QueryParameterBinding

getBinding(QueryParameterImplementor

para @Override public

QueryParameterBinding

getBinding(int position) { - final QueryParameterBinding binding = parameterBindingMapByNameOrPosition.get( position ); + final var binding = parameterBindingMapByNameOrPosition.get( position ); if ( binding == null ) { // Invoke this method to throw the exception parameterMetadata.getQueryParameter( position ); @@ -151,7 +142,7 @@ public

QueryParameterBinding

getBinding(int position) { @Override public

QueryParameterBinding

getBinding(String name) { - final QueryParameterBinding binding = parameterBindingMapByNameOrPosition.get( name ); + final var binding = parameterBindingMapByNameOrPosition.get( name ); if ( binding == null ) { // Invoke this method to throw the exception parameterMetadata.getQueryParameter( name ); @@ -177,7 +168,7 @@ public void validate() { @Override public boolean hasAnyMultiValuedBindings() { - for ( QueryParameterBinding binding : parameterBindingMap.values() ) { + for ( var binding : parameterBindingMap.values() ) { if ( binding.isMultiValued() ) { return true; } @@ -192,8 +183,8 @@ public void visitBindings(BiConsumer, ? super QueryPar @Override public QueryKey.ParameterBindingsMemento generateQueryKeyMemento(SharedSessionContractImplementor session) { - final MutableCacheKeyImpl mutableCacheKey = new MutableCacheKeyImpl( parameterBindingMap.size() ); - final JavaType tenantIdentifierJavaType = session.getFactory().getTenantIdentifierJavaType(); + final var mutableCacheKey = new MutableCacheKeyImpl( parameterBindingMap.size() ); + final var tenantIdentifierJavaType = session.getFactory().getTenantIdentifierJavaType(); final Object tenantId = session.getTenantIdentifierValue(); mutableCacheKey.addValue( tenantIdentifierJavaType.getMutabilityPlan().disassemble( tenantId, session ) ); mutableCacheKey.addHashCode( tenantId == null ? 0 : tenantIdentifierJavaType.extractHashCode( tenantId ) ); @@ -204,14 +195,13 @@ public QueryKey.ParameterBindingsMemento generateQueryKeyMemento(SharedSessionCo } private void handleQueryParameters(SharedSessionContractImplementor session, MutableCacheKeyImpl mutableCacheKey) { - final TypeConfiguration typeConfiguration = session.getFactory().getTypeConfiguration(); + final var typeConfiguration = session.getFactory().getTypeConfiguration(); // We know that parameters are consumed in processing order, this ensures consistency of generated cache keys - for ( Map.Entry, QueryParameterBinding> entry : parameterBindingMap.entrySet() ) { - final QueryParameter queryParameter = entry.getKey(); - final QueryParameterBinding binding = entry.getValue(); + for ( var entry : parameterBindingMap.entrySet() ) { + final var queryParameter = entry.getKey(); + final var binding = entry.getValue(); assert binding.isBound() : "Found unbound query parameter while generating cache key"; - final MappingModelExpressible mappingType = - determineMappingType( binding, queryParameter, typeConfiguration ); + final var mappingType = determineMappingType( binding, queryParameter, typeConfiguration ); if ( binding.isMultiValued() ) { for ( Object bindValue : binding.getBindValues() ) { assert bindValue != null; @@ -227,14 +217,14 @@ private void handleQueryParameters(SharedSessionContractImplementor session, Mut private static void handleFilterParameters(SharedSessionContractImplementor session, MutableCacheKeyImpl mutableCacheKey) { // Note: The following loops rely on getEnabledFilters() and getParameters() to return sorted maps - final LoadQueryInfluencers loadQueryInfluencers = session.getLoadQueryInfluencers(); - for ( Map.Entry entry : loadQueryInfluencers.getEnabledFilters().entrySet() ) { - final FilterImpl filter = (FilterImpl) entry.getValue(); - final FilterDefinition filterDefinition = filter.getFilterDefinition(); - for ( Map.Entry paramEntry : filter.getParameters().entrySet() ) { + final var loadQueryInfluencers = session.getLoadQueryInfluencers(); + for ( var entry : loadQueryInfluencers.getEnabledFilters().entrySet() ) { + final var filter = (FilterImpl) entry.getValue(); + final var filterDefinition = filter.getFilterDefinition(); + for ( var paramEntry : filter.getParameters().entrySet() ) { final String parameterName = paramEntry.getKey(); final Object paramValue = paramEntry.getValue(); - final JdbcMapping jdbcMapping = filterDefinition.getParameterJdbcMapping( parameterName ); + final var jdbcMapping = filterDefinition.getParameterJdbcMapping( parameterName ); assert jdbcMapping != null : // should not happen because FilterImpl protects against it "Undefined filter parameter '" + parameterName + "'"; @@ -245,26 +235,26 @@ private static void handleFilterParameters(SharedSessionContractImplementor sess private static MappingModelExpressible determineMappingType( QueryParameterBinding binding, QueryParameter queryParameter, TypeConfiguration typeConfiguration) { - final BindableType bindType = binding.getBindType(); + final var bindType = binding.getBindType(); if ( bindType instanceof MappingModelExpressible mappingModelExpressible ) { return mappingModelExpressible; } - final MappingModelExpressible type = binding.getType(); + final var type = binding.getType(); if ( type != null ) { return type; } if ( bindType instanceof JavaTypedExpressible javaTypedExpressible ) { - final JavaType jtd = javaTypedExpressible.getExpressibleJavaType(); - if ( jtd.getJavaTypeClass() != null ) { + final var javaTypeClass = javaTypedExpressible.getExpressibleJavaType().getJavaTypeClass(); + if ( javaTypeClass != null ) { // avoid dynamic models - return typeConfiguration.getBasicTypeForJavaType( jtd.getJavaTypeClass() ); + return typeConfiguration.getBasicTypeForJavaType( javaTypeClass ); } } if ( binding.isMultiValued() ) { - final Iterator iterator = binding.getBindValues().iterator(); + final var iterator = binding.getBindValues().iterator(); final Object firstNonNullBindValue = iterator.hasNext() ? iterator.next() : null; if ( firstNonNullBindValue != null ) { return typeConfiguration.getBasicTypeForJavaType( firstNonNullBindValue.getClass() );