Thanks to visit codestin.com
Credit goes to github.com

Skip to content

HHH-19448 realize API/SPI split for BindableType #10133

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +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.spi.BindingContext;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.function.FunctionKind;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import org.hibernate.QueryException;
import org.hibernate.metamodel.model.domain.ReturnableType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import java.util.List;

import org.hibernate.metamodel.model.domain.ReturnableType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.function.FunctionKind;
import org.hibernate.query.sqm.function.SelfRenderingSqmFunction;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
import org.hibernate.query.sqm.produce.function.FunctionArgumentException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import java.util.List;

import org.hibernate.metamodel.model.domain.ReturnableType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.common.TemporalUnit;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import java.util.List;

import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
import org.hibernate.query.sqm.produce.function.FunctionArgumentException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import java.util.List;

import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
import org.hibernate.query.sqm.produce.function.FunctionArgumentException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import org.hibernate.metamodel.mapping.JdbcMappingContainer;
import org.hibernate.metamodel.model.domain.ReturnableType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import java.util.List;

import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
import org.hibernate.query.sqm.produce.function.FunctionArgumentException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import java.util.List;

import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
import org.hibernate.query.sqm.produce.function.FunctionArgumentException;
import org.hibernate.query.sqm.tree.SqmTypedNode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import java.util.Objects;

import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
import org.hibernate.query.sqm.produce.function.FunctionArgumentException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +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.spi.BindingContext;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
import org.hibernate.query.sqm.produce.function.FunctionArgumentException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

import org.hibernate.type.descriptor.jdbc.XmlHelper;
import org.hibernate.metamodel.model.domain.ReturnableType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.function.FunctionKind;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import org.hibernate.type.descriptor.jdbc.XmlHelper;
import org.hibernate.metamodel.model.domain.ReturnableType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.function.FunctionKind;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.model.domain.ManagedDomainType;
import org.hibernate.metamodel.model.domain.NavigableRole;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.tuple.TupleType;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.metamodel.spi.EntityRepresentationStrategy;
Expand Down Expand Up @@ -143,7 +143,7 @@
jpaMetamodel = new JpaMetamodelImpl( typeConfiguration, this, serviceRegistry );
}

public JpaMetamodelImplementor getJpaMetamodel() {

Check notice

Code scanning / CodeQL

Missing Override annotation Note

This method overrides
BindingContext.getJpaMetamodel
; it is advisable to add an Override annotation.
return jpaMetamodel;
}

Expand Down Expand Up @@ -674,7 +674,7 @@

else if ( sqmExpressible instanceof AnonymousTupleSqmPathSource<?> anonymousTupleSqmPathSource ) {
return resolveMappingExpressible(
anonymousTupleSqmPathSource.getPathType().resolveExpressible( this ),
resolveExpressible( anonymousTupleSqmPathSource.getPathType() ),
tableGroupLocator
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import org.hibernate.metamodel.RuntimeMetamodels;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.type.MappingContext;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import org.hibernate.query.BindableType;
import org.hibernate.query.KeyedPage;
import org.hibernate.query.KeyedResultList;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.type.OutputableType;
import org.hibernate.query.Query;
import org.hibernate.query.QueryParameter;
Expand Down Expand Up @@ -380,7 +381,7 @@ public ProcedureCall markAsFunctionCall(BindableType<?> typeReference) {
}
if ( resultSetMapping.getNumberOfResultBuilders() == 0 ) {
final SqmExpressible<?> expressible =
typeReference.resolveExpressible( getSessionFactory().getRuntimeMetamodels() );
getSessionFactory().getRuntimeMetamodels().resolveExpressible( typeReference );
// Function returns might not be represented as callable parameters,
// but we still want to convert the result to the requested java type if possible
resultSetMapping.addResultBuilder( new ScalarDomainResultBuilder<>( expressible.getExpressibleJavaType() ) );
Expand Down Expand Up @@ -499,7 +500,7 @@ public <T> ProcedureParameter<T> registerParameter(
BindableType<T> typeReference,
ParameterMode mode) {
final SqmExpressible<T> expressible =
typeReference.resolveExpressible( getSessionFactory().getRuntimeMetamodels() );
getSessionFactory().getRuntimeMetamodels().resolveExpressible( typeReference );
final ProcedureParameterImpl<T> procedureParameter =
new ProcedureParameterImpl<>( position, mode, typeReference.getBindableJavaType(), expressible );
registerParameter( procedureParameter );
Expand Down Expand Up @@ -530,20 +531,23 @@ private <T> Class<T> getExpressibleJavaType(BindableType<T> parameterType) {
return null;
}
else {
final SqmExpressible<T> sqmExpressible =
parameterType.resolveExpressible( getSessionFactory().getQueryEngine().getCriteriaBuilder() );
final SqmExpressible<T> sqmExpressible = getNodeBuilder().resolveExpressible( parameterType );
assert sqmExpressible != null;
return sqmExpressible.getExpressibleJavaType().getJavaTypeClass();
}
}

private NodeBuilder getNodeBuilder() {
return getSessionFactory().getQueryEngine().getCriteriaBuilder();
}

@Override
public <T> ProcedureParameterImplementor<T> registerParameter(
String name,
BindableType<T> typeReference,
ParameterMode mode) {
final SqmExpressible<T> expressible =
typeReference.resolveExpressible( getSessionFactory().getRuntimeMetamodels() );
getSessionFactory().getRuntimeMetamodels().resolveExpressible( typeReference );
final ProcedureParameterImpl<T> parameter =
new ProcedureParameterImpl<>( name, mode, typeReference.getBindableJavaType(), expressible );
registerParameter( parameter );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ public ProcedureParameterImplementor<?> findQueryParameter(String name) {

@Override
public ProcedureParameterImplementor<?> getQueryParameter(String name) {
final ProcedureParameterImplementor<?> parameter = findQueryParameter( name );
final var parameter = findQueryParameter( name );
if ( parameter != null ) {
return parameter;
}
Expand Down Expand Up @@ -213,8 +213,9 @@ public void visitRegistrations(Consumer<QueryParameter<?>> action) {
public Set<Integer> getOrdinalParameterLabels() {
final Set<Integer> labels = new HashSet<>();
visitRegistrations( parameter -> {
if ( parameter.getPosition() != null ) {
labels.add( parameter.getPosition() );
final Integer position = parameter.getPosition();
if ( position != null ) {
labels.add( position );
}
} );
return labels;
Expand Down
24 changes: 8 additions & 16 deletions hibernate-core/src/main/java/org/hibernate/query/BindableType.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@
package org.hibernate.query;

import org.hibernate.Incubating;
import org.hibernate.Internal;
import org.hibernate.query.sqm.SqmExpressible;

/**
* Types that can be used to handle binding {@link Query} parameters
* Represents a type which can be bound to a {@linkplain CommonQueryContract query}
* parameter. An instance of {@code BindableType} may be passed to operations like
* {@link CommonQueryContract#setParameter(int, Object, BindableType)} and
* {@link CommonQueryContract#setParameter(String, Object, BindableType)}.
*
* @implNote Every implementation of this interface must also implement
* the SPI {@link org.hibernate.query.spi.BindableTypeImplementor}.
*
* @see org.hibernate.type.BasicTypeReference
* @see org.hibernate.type.StandardBasicTypes
Expand All @@ -19,19 +23,7 @@
@Incubating
public interface BindableType<J> {
/**
* The expected Java type
* The expected Java type of the argument to the query parameter.
*/
Class<J> getBindableJavaType();

default boolean isInstance(J value) {
return getBindableJavaType().isInstance( value );
}

/**
* Resolve this parameter type to the corresponding {@link SqmExpressible}
*
* @apiNote This internal operation is a layer-breaker, exposing an SQM-specific type
*/
@Internal
SqmExpressible<J> resolveExpressible(BindingContext bindingContext);
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -1567,7 +1567,7 @@ else if ( !allowPositionalOrAliases ) {
// make sure this selection exists
final SqmAliasedNode<?> nodeByPosition;
if ( queryPart instanceof SqmQueryGroup<?> ) {
final List<SqmSelection<?>> selections = queryPart.getFirstQuerySpec().getSelectClause().getSelections();
final var selections = queryPart.getFirstQuerySpec().getSelectClause().getSelections();
nodeByPosition = position <= selections.size() ? selections.get( position - 1 ) : null;
}
else {
Expand All @@ -1579,7 +1579,11 @@ else if ( !allowPositionalOrAliases ) {
query );
}

return new SqmAliasedNodeRef( position, integerDomainType.resolveExpressible( nodeBuilder ), nodeBuilder);
return new SqmAliasedNodeRef(
position,
nodeBuilder.resolveExpressible( integerDomainType ),
nodeBuilder
);
}
else if ( child instanceof HqlParser.IdentifierContext identifierContext ) {
final String identifierText = visitIdentifier( identifierContext );
Expand Down Expand Up @@ -1629,7 +1633,11 @@ else if ( selectableNode instanceof SqmPath<?> path ) {
);
}
else if ( sqmPosition != 0 ) {
return new SqmAliasedNodeRef( sqmPosition, nodeBuilder.getIntegerType(), nodeBuilder );
return new SqmAliasedNodeRef(
sqmPosition,
nodeBuilder.getIntegerType(),
nodeBuilder
);
}
}
else {
Expand All @@ -1643,7 +1651,11 @@ else if ( sqmPosition != 0 ) {
// This is syntactically disallowed
throw new SyntaxException( "'collate' is not allowed for alias-based 'order by' or 'group by' items" );
}
return new SqmAliasedNodeRef( correspondingPosition, integerDomainType.resolveExpressible( nodeBuilder ), nodeBuilder );
return new SqmAliasedNodeRef(
correspondingPosition,
nodeBuilder.resolveExpressible( integerDomainType ),
nodeBuilder
);
}

final SqmFrom<?, ?> sqmFrom =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.query.BindableType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.BindingContext;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.type.StandardBasicTypes;
import org.hibernate.type.descriptor.java.JavaTypeHelper;
Expand Down Expand Up @@ -41,7 +41,7 @@ public <T> BindableType<T> resolveTemporalPrecision(
if ( precision != null ) {
final TemporalJavaType<T> temporalJtd;
if ( declaredParameterType != null ) {
final SqmExpressible<T> sqmExpressible = declaredParameterType.resolveExpressible( bindingContext );
final SqmExpressible<T> sqmExpressible = bindingContext.resolveExpressible( declaredParameterType );
if ( !( JavaTypeHelper.isTemporal( sqmExpressible.getExpressibleJavaType() ) ) ) {
throw new UnsupportedOperationException(
"Cannot treat non-temporal parameter type with temporal precision"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
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.spi.BindingContext;
import org.hibernate.query.hql.HqlTranslator;
import org.hibernate.query.hql.internal.StandardHqlTranslator;
import org.hibernate.query.hql.spi.SqmCreationOptions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ private void setExplicitTemporalPrecision(TemporalType precision) {
}

private JavaType<? super T> determineJavaType(BindableType<? super T> bindType) {
final SqmExpressible<? super T> sqmExpressible = bindType.resolveExpressible( getCriteriaBuilder() );
final SqmExpressible<? super T> sqmExpressible = getCriteriaBuilder().resolveExpressible( bindType );
assert sqmExpressible != null;
return sqmExpressible.getExpressibleJavaType();
}
Expand Down Expand Up @@ -337,7 +337,7 @@ private Object coerce(T value, BindableType<? super T> parameterType) {
return null;
}
else {
final SqmExpressible<? super T> sqmExpressible = parameterType.resolveExpressible( getCriteriaBuilder() );
final SqmExpressible<? super T> sqmExpressible = getCriteriaBuilder().resolveExpressible( parameterType );
assert sqmExpressible != null;
return sqmExpressible.getExpressibleJavaType().coerce( value, this );
}
Expand Down
Loading
Loading