clean up lots of warnings by adding wildcards to raw types

also comment out some unused code
This commit is contained in:
Gavin King 2022-01-10 11:11:17 +01:00
parent 4b5e6e1969
commit 3e8f1c67df
58 changed files with 435 additions and 401 deletions

View File

@ -59,14 +59,14 @@ public class AvgFunction extends AbstractSqmSelfRenderingFunctionDescriptor {
} }
@Override @Override
public void render(SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) { public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
render( sqlAppender, sqlAstArguments, null, walker ); render( sqlAppender, sqlAstArguments, null, walker );
} }
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
Predicate filter, Predicate filter,
SqlAstTranslator<?> translator) { SqlAstTranslator<?> translator) {
final boolean caseWrapper = filter != null && !translator.supportsFilterClause(); final boolean caseWrapper = filter != null && !translator.supportsFilterClause();

View File

@ -10,7 +10,6 @@ import java.util.List;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator; import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator;
import org.hibernate.query.sqm.produce.function.FunctionParameterType;
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators; import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers; import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
import org.hibernate.sql.ast.SqlAstTranslator; import org.hibernate.sql.ast.SqlAstTranslator;
@ -40,7 +39,7 @@ public class CaseLeastGreatestEmulation
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> arguments, List<? extends SqlAstNode> arguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
final int numberOfArguments = arguments.size(); final int numberOfArguments = arguments.size();
if ( numberOfArguments > 1 ) { if ( numberOfArguments > 1 ) {

View File

@ -43,7 +43,7 @@ public class CaseWhenEveryAnyEmulation extends AbstractSqmSelfRenderingFunctionD
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
Predicate filter, Predicate filter,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
if ( every ) { if ( every ) {
@ -66,7 +66,7 @@ public class CaseWhenEveryAnyEmulation extends AbstractSqmSelfRenderingFunctionD
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) { SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
this.render( sqlAppender, sqlAstArguments, null, walker ); this.render( sqlAppender, sqlAstArguments, null, walker );
} }
} }

View File

@ -51,7 +51,7 @@ public class CastFunction extends AbstractSqmSelfRenderingFunctionDescriptor {
} }
@Override @Override
public void render(SqlAppender sqlAppender, List<SqlAstNode> arguments, SqlAstTranslator<?> walker) { public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> arguments, SqlAstTranslator<?> walker) {
final Expression source = (Expression) arguments.get( 0 ); final Expression source = (Expression) arguments.get( 0 );
final JdbcMapping sourceMapping = source.getExpressionType().getJdbcMappings().get( 0 ); final JdbcMapping sourceMapping = source.getExpressionType().getJdbcMappings().get( 0 );
final CastType sourceType = getCastType( sourceMapping ); final CastType sourceType = getCastType( sourceMapping );

View File

@ -63,7 +63,7 @@ public class CastingConcatFunction extends AbstractSqmSelfRenderingFunctionDescr
} }
@Override @Override
public void render(SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) { public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
sqlAppender.appendSql( '(' ); sqlAppender.appendSql( '(' );
renderAsString( sqlAppender, walker, (Expression) sqlAstArguments.get( 0 ) ); renderAsString( sqlAppender, walker, (Expression) sqlAstArguments.get( 0 ) );
for ( int i = 1; i < sqlAstArguments.size(); i++ ) { for ( int i = 1; i < sqlAstArguments.size(); i++ ) {

View File

@ -68,14 +68,14 @@ public class CountFunction extends AbstractSqmSelfRenderingFunctionDescriptor {
} }
@Override @Override
public void render(SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) { public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
render( sqlAppender, sqlAstArguments, null, walker ); render( sqlAppender, sqlAstArguments, null, walker );
} }
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
Predicate filter, Predicate filter,
SqlAstTranslator<?> translator) { SqlAstTranslator<?> translator) {
final boolean caseWrapper = filter != null && !translator.supportsFilterClause(); final boolean caseWrapper = filter != null && !translator.supportsFilterClause();

View File

@ -36,7 +36,7 @@ public class CurrentFunction
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> arguments, List<? extends SqlAstNode> arguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
sqlAppender.appendSql( sql ); sqlAppender.appendSql( sql );
} }

View File

@ -49,7 +49,7 @@ public class DB2FormatEmulation
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> arguments, List<? extends SqlAstNode> arguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
final Expression datetime = (Expression) arguments.get(0); final Expression datetime = (Expression) arguments.get(0);
final boolean isTime = TypeConfiguration.getSqlTemporalType( datetime.getExpressionType() ) == TemporalType.TIME; final boolean isTime = TypeConfiguration.getSqlTemporalType( datetime.getExpressionType() ) == TemporalType.TIME;

View File

@ -43,7 +43,7 @@ public class DerbyLpadEmulation
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> arguments, List<? extends SqlAstNode> arguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
final SqlAstNode string = arguments.get( 0 ); final SqlAstNode string = arguments.get( 0 );
final SqlAstNode length = arguments.get( 1 ); final SqlAstNode length = arguments.get( 1 );

View File

@ -43,7 +43,7 @@ public class DerbyRpadEmulation
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> arguments, List<? extends SqlAstNode> arguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
final SqlAstNode string = arguments.get( 0 ); final SqlAstNode string = arguments.get( 0 );
final SqlAstNode length = arguments.get( 1 ); final SqlAstNode length = arguments.get( 1 );

View File

@ -44,7 +44,7 @@ public class EveryAnyEmulation extends AbstractSqmSelfRenderingFunctionDescripto
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
Predicate filter, Predicate filter,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
sqlAppender.appendSql( "(sum(case when " ); sqlAppender.appendSql( "(sum(case when " );
@ -72,7 +72,7 @@ public class EveryAnyEmulation extends AbstractSqmSelfRenderingFunctionDescripto
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) { SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
this.render( sqlAppender, sqlAstArguments, null, walker ); this.render( sqlAppender, sqlAstArguments, null, walker );
} }
} }

View File

@ -34,7 +34,7 @@ public class FieldFunction extends AbstractSqmSelfRenderingFunctionDescriptor {
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) { SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
sqlAppender.appendSql( "field(" ); sqlAppender.appendSql( "field(" );
sqlAstArguments.get( 0 ).accept( walker ); sqlAstArguments.get( 0 ).accept( walker );
for ( int i = 1; i < sqlAstArguments.size(); i++ ) { for ( int i = 1; i < sqlAstArguments.size(); i++ ) {

View File

@ -39,7 +39,7 @@ public class QuantifiedLeastGreatestEmulation
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> arguments, List<? extends SqlAstNode> arguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
final int numberOfArguments = arguments.size(); final int numberOfArguments = arguments.size();
if ( numberOfArguments > 1 ) { if ( numberOfArguments > 1 ) {

View File

@ -44,7 +44,7 @@ public class SQLServerEveryAnyEmulation extends AbstractSqmSelfRenderingFunction
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
Predicate filter, Predicate filter,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
if ( every ) { if ( every ) {
@ -67,7 +67,7 @@ public class SQLServerEveryAnyEmulation extends AbstractSqmSelfRenderingFunction
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) { SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
this.render( sqlAppender, sqlAstArguments, null, walker ); this.render( sqlAppender, sqlAstArguments, null, walker );
} }
} }

View File

@ -10,10 +10,8 @@ import java.util.List;
import jakarta.persistence.TemporalType; import jakarta.persistence.TemporalType;
import org.hibernate.dialect.SQLServerDialect; import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator; import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator;
import org.hibernate.query.sqm.produce.function.FunctionParameterType;
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators; import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers; import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
import org.hibernate.sql.ast.SqlAstTranslator; import org.hibernate.sql.ast.SqlAstTranslator;
@ -50,7 +48,7 @@ public class SQLServerFormatEmulation extends AbstractSqmSelfRenderingFunctionDe
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> arguments, List<? extends SqlAstNode> arguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
final Expression datetime = (Expression) arguments.get(0); final Expression datetime = (Expression) arguments.get(0);
final boolean isTime = TypeConfiguration.getSqlTemporalType( datetime.getExpressionType() ) == TemporalType.TIME; final boolean isTime = TypeConfiguration.getSqlTemporalType( datetime.getExpressionType() ) == TemporalType.TIME;

View File

@ -15,7 +15,6 @@ import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.spi.SqlAppender; import org.hibernate.sql.ast.spi.SqlAppender;
import org.hibernate.sql.ast.tree.SqlAstNode; import org.hibernate.sql.ast.tree.SqlAstNode;
import org.hibernate.sql.ast.tree.expression.QueryLiteral; import org.hibernate.sql.ast.tree.expression.QueryLiteral;
import org.hibernate.type.BasicType;
import org.hibernate.type.JavaObjectType; import org.hibernate.type.JavaObjectType;
/** /**
@ -37,7 +36,7 @@ public class SqlFunction
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> arguments, List<? extends SqlAstNode> arguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
final QueryLiteral<String> sqlFragmentLiteral = (QueryLiteral<String>) arguments.get( 0 ); final QueryLiteral<String> sqlFragmentLiteral = (QueryLiteral<String>) arguments.get( 0 );
final String sqlFragment = sqlFragmentLiteral.getLiteralValue(); final String sqlFragment = sqlFragmentLiteral.getLiteralValue();

View File

@ -67,7 +67,7 @@ public class TimestampaddFunction
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> arguments, List<? extends SqlAstNode> arguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
final DurationUnit field = (DurationUnit) arguments.get( 0 ); final DurationUnit field = (DurationUnit) arguments.get( 0 );
@ -143,7 +143,7 @@ public class TimestampaddFunction
1, 1,
new SelfRenderingFunctionSqlAstExpression( new SelfRenderingFunctionSqlAstExpression(
"cast", "cast",
castFunction::render, castFunction,
castArguments, castArguments,
integerType, integerType,
integerType integerType
@ -190,7 +190,7 @@ public class TimestampaddFunction
Expression to = (Expression) sqlAstArguments[2]; Expression to = (Expression) sqlAstArguments[2];
return new SelfRenderingFunctionSqlAstExpression( return new SelfRenderingFunctionSqlAstExpression(
getName(), getName(),
this::render, this,
asList( sqlAstArguments ), asList( sqlAstArguments ),
impliedResultType != null impliedResultType != null
? impliedResultType ? impliedResultType

View File

@ -13,7 +13,6 @@ import org.hibernate.metamodel.model.domain.AllowableFunctionReturnType;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.function.SelfRenderingFunctionSqlAstExpression; import org.hibernate.query.sqm.function.SelfRenderingFunctionSqlAstExpression;
import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator; import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator;
import org.hibernate.query.sqm.produce.function.FunctionParameterType;
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators; import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers; import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
import org.hibernate.query.sqm.produce.function.internal.PatternRenderer; import org.hibernate.query.sqm.produce.function.internal.PatternRenderer;
@ -54,7 +53,7 @@ public class TimestampdiffFunction
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> arguments, List<? extends SqlAstNode> arguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
final DurationUnit field = (DurationUnit) arguments.get( 0 ); final DurationUnit field = (DurationUnit) arguments.get( 0 );
@ -104,7 +103,7 @@ public class TimestampdiffFunction
DurationUnit field = (DurationUnit) sqlAstArguments[0]; DurationUnit field = (DurationUnit) sqlAstArguments[0];
return new SelfRenderingFunctionSqlAstExpression( return new SelfRenderingFunctionSqlAstExpression(
getName(), getName(),
this::render, this,
asList( sqlAstArguments ), asList( sqlAstArguments ),
impliedResultType != null impliedResultType != null
? impliedResultType ? impliedResultType

View File

@ -67,7 +67,7 @@ public class TransactSQLStrFunction extends CastStrEmulation implements Function
} }
@Override @Override
public void render(SqlAppender sqlAppender, List<SqlAstNode> arguments, SqlAstTranslator<?> walker) { public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> arguments, SqlAstTranslator<?> walker) {
sqlAppender.appendSql( "str(" ); sqlAppender.appendSql( "str(" );
arguments.get( 0 ).accept( walker ); arguments.get( 0 ).accept( walker );
for ( int i = 1; i < arguments.size(); i++ ) { for ( int i = 1; i < arguments.size(); i++ ) {

View File

@ -17,7 +17,7 @@ import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.spi.SqlAppender; import org.hibernate.sql.ast.spi.SqlAppender;
import org.hibernate.sql.ast.tree.SqlAstNode; import org.hibernate.sql.ast.tree.SqlAstNode;
import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.expression.QueryLiteral; import org.hibernate.sql.ast.tree.expression.Literal;
import org.hibernate.sql.ast.tree.expression.TrimSpecification; import org.hibernate.sql.ast.tree.expression.TrimSpecification;
import org.hibernate.type.StandardBasicTypes; import org.hibernate.type.StandardBasicTypes;
import org.hibernate.type.spi.TypeConfiguration; import org.hibernate.type.spi.TypeConfiguration;
@ -50,12 +50,12 @@ public class TrimFunction extends AbstractSqmSelfRenderingFunctionDescriptor {
} }
@Override @Override
public void render(SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) { public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
final TrimSpec specification = ( (TrimSpecification) sqlAstArguments.get( 0 ) ).getSpecification(); final TrimSpec specification = ( (TrimSpecification) sqlAstArguments.get( 0 ) ).getSpecification();
final Character trimCharacter = ( (QueryLiteral<Character>) sqlAstArguments.get( 1 ) ).getLiteralValue(); final Object trimCharacter = ( (Literal) sqlAstArguments.get( 1 ) ).getLiteralValue();
final Expression sourceExpr = (Expression) sqlAstArguments.get( 2 ); final Expression sourceExpr = (Expression) sqlAstArguments.get( 2 );
String trim = dialect.trimPattern( specification, trimCharacter ); String trim = dialect.trimPattern( specification, (char) trimCharacter );
new PatternRenderer( trim ).render( sqlAppender, Collections.singletonList( sourceExpr ), walker ); new PatternRenderer( trim ).render( sqlAppender, Collections.singletonList( sourceExpr ), walker );
} }

View File

@ -108,7 +108,7 @@ public class FunctionExpression implements OrderingExpression, FunctionRendering
} }
@Override @Override
public void render(SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) { public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
sqlAppender.appendSql( name ); sqlAppender.appendSql( name );
sqlAppender.appendSql( '(' ); sqlAppender.appendSql( '(' );
if ( !sqlAstArguments.isEmpty() ) { if ( !sqlAstArguments.isEmpty() ) {

View File

@ -39,7 +39,7 @@ public class ParameterMetadataImpl implements ParameterMetadataImplementor {
*/ */
public static final ParameterMetadataImpl EMPTY = new ParameterMetadataImpl(); public static final ParameterMetadataImpl EMPTY = new ParameterMetadataImpl();
private final Map<QueryParameterImplementor<?>, List<SqmParameter>> queryParameters; private final Map<QueryParameterImplementor<?>, List<SqmParameter<?>>> queryParameters;
private final Set<String> names; private final Set<String> names;
private final Set<Integer> labels; private final Set<Integer> labels;
@ -51,7 +51,7 @@ public class ParameterMetadataImpl implements ParameterMetadataImplementor {
this.labels = Collections.emptySet(); this.labels = Collections.emptySet();
} }
public ParameterMetadataImpl(Map<QueryParameterImplementor<?>, List<SqmParameter>> queryParameters) { public ParameterMetadataImpl(Map<QueryParameterImplementor<?>, List<SqmParameter<?>>> queryParameters) {
this.queryParameters = queryParameters; this.queryParameters = queryParameters;
// if we have any ordinal parameters, make sure the numbers // if we have any ordinal parameters, make sure the numbers
@ -168,12 +168,12 @@ public class ParameterMetadataImpl implements ParameterMetadataImplementor {
@Override @Override
public <T> AllowableParameterType<T> getInferredParameterType(QueryParameter<T> parameter) { public <T> AllowableParameterType<T> getInferredParameterType(QueryParameter<T> parameter) {
final List<SqmParameter> sqmParameters = queryParameters.get( parameter ); final List<SqmParameter<?>> sqmParameters = queryParameters.get( parameter );
if ( sqmParameters == null || sqmParameters.isEmpty() ) { if ( sqmParameters == null || sqmParameters.isEmpty() ) {
return null; return null;
} }
for ( SqmParameter sqmParameter : sqmParameters ) { for ( SqmParameter<?> sqmParameter : sqmParameters ) {
final AllowableParameterType nodeType = sqmParameter.getNodeType(); final AllowableParameterType<T> nodeType = (AllowableParameterType<T>) sqmParameter.getNodeType();
if ( nodeType != null ) { if ( nodeType != null ) {
return nodeType; return nodeType;
} }

View File

@ -6,13 +6,10 @@
*/ */
package org.hibernate.query.internal; package org.hibernate.query.internal;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Supplier; import java.util.function.Supplier;
import org.hibernate.metamodel.mapping.MappingModelExpressable;
import org.hibernate.query.spi.HqlInterpretation; import org.hibernate.query.spi.HqlInterpretation;
import org.hibernate.query.spi.NonSelectQueryPlan; import org.hibernate.query.spi.NonSelectQueryPlan;
import org.hibernate.query.spi.ParameterMetadataImplementor; import org.hibernate.query.spi.ParameterMetadataImplementor;
@ -21,7 +18,6 @@ import org.hibernate.query.spi.SelectQueryPlan;
import org.hibernate.query.sql.spi.ParameterInterpretation; import org.hibernate.query.sql.spi.ParameterInterpretation;
import org.hibernate.query.sqm.internal.DomainParameterXref; import org.hibernate.query.sqm.internal.DomainParameterXref;
import org.hibernate.query.sqm.tree.SqmStatement; import org.hibernate.query.sqm.tree.SqmStatement;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.stat.spi.StatisticsImplementor; import org.hibernate.stat.spi.StatisticsImplementor;
/** /**
@ -90,7 +86,7 @@ public class QueryInterpretationCacheDisabledImpl implements QueryInterpretation
return new HqlInterpretation() { return new HqlInterpretation() {
@Override @Override
public SqmStatement getSqmStatement() { public SqmStatement<?> getSqmStatement() {
return sqmStatement; return sqmStatement;
} }

View File

@ -194,11 +194,11 @@ public class QueryInterpretationCacheStandardImpl implements QueryInterpretation
private static class ImmutableHqlInterpretation { private static class ImmutableHqlInterpretation {
private final SqmStatement sqmStatement; private final SqmStatement<?> sqmStatement;
private final ParameterMetadataImplementor parameterMetadata; private final ParameterMetadataImplementor parameterMetadata;
public ImmutableHqlInterpretation( public ImmutableHqlInterpretation(
SqmStatement sqmStatement, SqmStatement<?> sqmStatement,
ParameterMetadataImplementor parameterMetadata) { ParameterMetadataImplementor parameterMetadata) {
this.sqmStatement = sqmStatement; this.sqmStatement = sqmStatement;
this.parameterMetadata = parameterMetadata; this.parameterMetadata = parameterMetadata;

View File

@ -26,7 +26,7 @@ public class QueryParameterNamedImpl<T> extends AbstractQueryParameter<T> {
* *
* @return The parameter descriptor * @return The parameter descriptor
*/ */
public static <T> QueryParameterNamedImpl<T> fromSqm(SqmParameter parameter) { public static <T> QueryParameterNamedImpl<T> fromSqm(SqmParameter<?> parameter) {
assert parameter.getName() != null; assert parameter.getName() != null;
assert parameter.getPosition() == null; assert parameter.getPosition() == null;
@ -63,7 +63,7 @@ public class QueryParameterNamedImpl<T> extends AbstractQueryParameter<T> {
@Override @Override
public NamedQueryMemento.ParameterMemento toMemento() { public NamedQueryMemento.ParameterMemento toMemento() {
return session -> new QueryParameterNamedImpl( getName(), allowsMultiValuedBinding(), getHibernateType() ); return session -> new QueryParameterNamedImpl<>( getName(), allowsMultiValuedBinding(), getHibernateType() );
} }
@Override @Override

View File

@ -169,10 +169,7 @@ public interface QueryOptions {
default boolean hasLimit() { default boolean hasLimit() {
final Limit limit = getLimit(); final Limit limit = getLimit();
if ( limit != null ) { if ( limit != null ) {
if ( limit.getFirstRow() != null ) { if ( limit.getFirstRow() != null || limit.getMaxRows() != null ) {
return true;
}
if ( limit.getMaxRows() != null ) {
return true; return true;
} }
} }

View File

@ -13,12 +13,12 @@ import org.hibernate.query.sqm.tree.SqmStatement;
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class SimpleHqlInterpretationImpl implements HqlInterpretation { public class SimpleHqlInterpretationImpl implements HqlInterpretation {
private final SqmStatement sqmStatement; private final SqmStatement<?> sqmStatement;
private final ParameterMetadataImplementor parameterMetadata; private final ParameterMetadataImplementor parameterMetadata;
private final DomainParameterXref domainParameterXref; private final DomainParameterXref domainParameterXref;
public SimpleHqlInterpretationImpl( public SimpleHqlInterpretationImpl(
SqmStatement sqmStatement, SqmStatement<?> sqmStatement,
ParameterMetadataImplementor parameterMetadata, ParameterMetadataImplementor parameterMetadata,
DomainParameterXref domainParameterXref) { DomainParameterXref domainParameterXref) {
this.sqmStatement = sqmStatement; this.sqmStatement = sqmStatement;
@ -27,7 +27,7 @@ public class SimpleHqlInterpretationImpl implements HqlInterpretation {
} }
@Override @Override
public SqmStatement getSqmStatement() { public SqmStatement<?> getSqmStatement() {
return sqmStatement; return sqmStatement;
} }

View File

@ -61,7 +61,7 @@ public abstract class AbstractSqmSelfRenderingFunctionDescriptor
} }
return new SelfRenderingSqmFunction<>( return new SelfRenderingSqmFunction<>(
this, this,
this::render, (sqlAppender, sqlAstArguments, walker) -> render(sqlAppender, sqlAstArguments, walker),
arguments, arguments,
impliedResultType, impliedResultType,
getArgumentsValidator(), getArgumentsValidator(),
@ -99,12 +99,12 @@ public abstract class AbstractSqmSelfRenderingFunctionDescriptor
*/ */
public abstract void render( public abstract void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
SqlAstTranslator<?> walker); SqlAstTranslator<?> walker);
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
Predicate filter, Predicate filter,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
render( sqlAppender, sqlAstArguments, walker ); render( sqlAppender, sqlAstArguments, walker );

View File

@ -7,7 +7,6 @@
package org.hibernate.query.sqm.function; package org.hibernate.query.sqm.function;
import org.hibernate.sql.ast.SqlAstTranslator; import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.SqlAstWalker;
import org.hibernate.sql.ast.spi.SqlAppender; import org.hibernate.sql.ast.spi.SqlAppender;
import org.hibernate.sql.ast.tree.SqlAstNode; import org.hibernate.sql.ast.tree.SqlAstNode;
import org.hibernate.sql.ast.tree.predicate.Predicate; import org.hibernate.sql.ast.tree.predicate.Predicate;
@ -28,12 +27,12 @@ import java.util.List;
public interface FunctionRenderingSupport { public interface FunctionRenderingSupport {
void render( void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
SqlAstTranslator<?> walker); SqlAstTranslator<?> walker);
default void render( default void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
Predicate filter, Predicate filter,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
// Ignore the filter by default. Subclasses will override this // Ignore the filter by default. Subclasses will override this

View File

@ -91,7 +91,7 @@ public class NamedSqmFunctionDescriptor
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
SqlAstTranslator<?> translator) { SqlAstTranslator<?> translator) {
render( sqlAppender, sqlAstArguments, null, translator ); render( sqlAppender, sqlAstArguments, null, translator );
} }
@ -99,7 +99,7 @@ public class NamedSqmFunctionDescriptor
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
Predicate filter, Predicate filter,
SqlAstTranslator<?> translator) { SqlAstTranslator<?> translator) {
final boolean useParens = useParenthesesWhenNoArgs || !sqlAstArguments.isEmpty(); final boolean useParens = useParenthesesWhenNoArgs || !sqlAstArguments.isEmpty();

View File

@ -71,13 +71,13 @@ public class PatternBasedSqmFunctionDescriptor
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
SqlAstTranslator<?> walker) { SqlAstTranslator<?> walker) {
renderer.render( sqlAppender, sqlAstArguments, null, walker ); renderer.render( sqlAppender, sqlAstArguments, null, walker );
} }
@Override @Override
public void render(SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, Predicate filter, SqlAstTranslator<?> walker) { public void render(SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, Predicate filter, SqlAstTranslator<?> walker) {
renderer.render( sqlAppender, sqlAstArguments, filter, walker ); renderer.render( sqlAppender, sqlAstArguments, filter, walker );
} }

View File

@ -31,7 +31,7 @@ public class SelfRenderingAggregateFunctionSqlAstExpression extends SelfRenderin
public SelfRenderingAggregateFunctionSqlAstExpression( public SelfRenderingAggregateFunctionSqlAstExpression(
String functionName, String functionName,
FunctionRenderingSupport renderer, FunctionRenderingSupport renderer,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
Predicate filter, Predicate filter,
AllowableFunctionReturnType<?> type, AllowableFunctionReturnType<?> type,
JdbcMappingContainer expressable) { JdbcMappingContainer expressable) {

View File

@ -47,14 +47,14 @@ public class SelfRenderingFunctionSqlAstExpression
implements SelfRenderingExpression, Selectable, SqlExpressable, DomainResultProducer, FunctionExpression { implements SelfRenderingExpression, Selectable, SqlExpressable, DomainResultProducer, FunctionExpression {
private final String functionName; private final String functionName;
private final FunctionRenderingSupport renderer; private final FunctionRenderingSupport renderer;
private final List<SqlAstNode> sqlAstArguments; private final List<? extends SqlAstNode> sqlAstArguments;
private final AllowableFunctionReturnType<?> type; private final AllowableFunctionReturnType<?> type;
private final JdbcMappingContainer expressable; private final JdbcMappingContainer expressable;
public SelfRenderingFunctionSqlAstExpression( public SelfRenderingFunctionSqlAstExpression(
String functionName, String functionName,
FunctionRenderingSupport renderer, FunctionRenderingSupport renderer,
List<SqlAstNode> sqlAstArguments, List<? extends SqlAstNode> sqlAstArguments,
AllowableFunctionReturnType<?> type, AllowableFunctionReturnType<?> type,
JdbcMappingContainer expressable) { JdbcMappingContainer expressable) {
this.functionName = functionName; this.functionName = functionName;
@ -71,7 +71,7 @@ public class SelfRenderingFunctionSqlAstExpression
} }
@Override @Override
public List<SqlAstNode> getArguments() { public List<? extends SqlAstNode> getArguments() {
return sqlAstArguments; return sqlAstArguments;
} }

View File

@ -30,6 +30,7 @@ import org.hibernate.query.spi.QueryOptions;
import org.hibernate.query.spi.QueryParameterImplementor; import org.hibernate.query.spi.QueryParameterImplementor;
import org.hibernate.query.spi.ScrollableResultsImplementor; import org.hibernate.query.spi.ScrollableResultsImplementor;
import org.hibernate.query.spi.SelectQueryPlan; import org.hibernate.query.spi.SelectQueryPlan;
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
import org.hibernate.query.sqm.sql.SqmTranslation; import org.hibernate.query.sqm.sql.SqmTranslation;
import org.hibernate.query.sqm.sql.SqmTranslator; import org.hibernate.query.sqm.sql.SqmTranslator;
import org.hibernate.query.sqm.sql.SqmTranslatorFactory; import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
@ -68,7 +69,7 @@ import static org.hibernate.query.sqm.internal.QuerySqmImpl.CRITERIA_HQL_STRING;
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> { public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
private final SqmSelectStatement sqm; private final SqmSelectStatement<?> sqm;
private final String hql; private final String hql;
private final DomainParameterXref domainParameterXref; private final DomainParameterXref domainParameterXref;
private final RowTransformer<R> rowTransformer; private final RowTransformer<R> rowTransformer;
@ -79,7 +80,7 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
public ConcreteSqmSelectQueryPlan( public ConcreteSqmSelectQueryPlan(
SqmSelectStatement sqm, SqmSelectStatement<?> sqm,
String hql, String hql,
DomainParameterXref domainParameterXref, DomainParameterXref domainParameterXref,
Class<R> resultType, Class<R> resultType,
@ -136,26 +137,24 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
this.scrollInterpreter = (scrollMode, executionContext, sqmInterpretation, jdbcParameterBindings) -> { this.scrollInterpreter = (scrollMode, executionContext, sqmInterpretation, jdbcParameterBindings) -> {
try { try {
final SubselectFetch.RegistrationHandler subSelectFetchKeyHandler = SubselectFetch.createRegistrationHandler( // final SubselectFetch.RegistrationHandler subSelectFetchKeyHandler = SubselectFetch.createRegistrationHandler(
executionContext.getSession().getPersistenceContext().getBatchFetchQueue(), // executionContext.getSession().getPersistenceContext().getBatchFetchQueue(),
sqmInterpretation.selectStatement, // sqmInterpretation.selectStatement,
Collections.emptyList(), // Collections.emptyList(),
jdbcParameterBindings // jdbcParameterBindings
); // );
final JdbcSelectExecutor jdbcSelectExecutor = executionContext.getSession() final JdbcSelectExecutor jdbcSelectExecutor = executionContext.getSession()
.getFactory() .getFactory()
.getJdbcServices() .getJdbcServices()
.getJdbcSelectExecutor(); .getJdbcSelectExecutor();
final ScrollableResultsImplementor<R> result = jdbcSelectExecutor.scroll( return jdbcSelectExecutor.scroll(
sqmInterpretation.getJdbcSelect(), sqmInterpretation.getJdbcSelect(),
scrollMode, scrollMode,
jdbcParameterBindings, jdbcParameterBindings,
new SqmJdbcExecutionContextAdapter( executionContext, sqmInterpretation.jdbcSelect ), new SqmJdbcExecutionContextAdapter( executionContext, sqmInterpretation.jdbcSelect ),
rowTransformer rowTransformer
); );
return result;
} }
finally { finally {
domainParameterXref.clearExpansions(); domainParameterXref.clearExpansions();
@ -176,7 +175,7 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private RowTransformer<R> determineRowTransformer( private RowTransformer<R> determineRowTransformer(
SqmSelectStatement sqm, SqmSelectStatement<?> sqm,
Class<R> resultType, Class<R> resultType,
QueryOptions queryOptions) { QueryOptions queryOptions) {
if ( resultType == null || resultType.isArray() ) { if ( resultType == null || resultType.isArray() ) {
@ -237,7 +236,7 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
} }
private RowTransformer<R> makeRowTransformerTupleTransformerAdapter( private RowTransformer<R> makeRowTransformerTupleTransformerAdapter(
SqmSelectStatement sqm, SqmSelectStatement<?> sqm,
QueryOptions queryOptions) { QueryOptions queryOptions) {
final List<String> aliases = new ArrayList<>(); final List<String> aliases = new ArrayList<>();
for ( SqmSelection<?> sqmSelection : sqm.getQuerySpec().getSelectClause().getSelections() ) { for ( SqmSelection<?> sqmSelection : sqm.getQuerySpec().getSelectClause().getSelections() ) {
@ -252,8 +251,9 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
} }
} }
return new RowTransformerTupleTransformerAdapter<>( return new RowTransformerTupleTransformerAdapter<R>(
ArrayHelper.toStringArray( aliases ), queryOptions.getTupleTransformer() ArrayHelper.toStringArray( aliases ),
queryOptions.getTupleTransformer()
); );
} }
@ -332,7 +332,13 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
sqmInterpretation.getJdbcParamsXref(), sqmInterpretation.getJdbcParamsXref(),
session.getFactory().getDomainModel(), session.getFactory().getDomainModel(),
sqmInterpretation.getTableGroupAccess()::findTableGroup, sqmInterpretation.getTableGroupAccess()::findTableGroup,
sqmInterpretation.getSqmParameterMappingModelTypes()::get, new SqmParameterMappingModelResolutionAccess() {
//this is pretty ugly!
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) sqmInterpretation.getSqmParameterMappingModelTypes().get(parameter);
}
},
session session
); );
sqmInterpretation.getJdbcSelect().bindFilterJdbcParameters( jdbcParameterBindings ); sqmInterpretation.getJdbcSelect().bindFilterJdbcParameters( jdbcParameterBindings );
@ -340,7 +346,7 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
} }
private static CacheableSqmInterpretation buildCacheableSqmInterpretation( private static CacheableSqmInterpretation buildCacheableSqmInterpretation(
SqmSelectStatement sqm, SqmSelectStatement<?> sqm,
DomainParameterXref domainParameterXref, DomainParameterXref domainParameterXref,
DomainQueryExecutionContext executionContext) { DomainQueryExecutionContext executionContext) {
final SharedSessionContractImplementor session = executionContext.getSession(); final SharedSessionContractImplementor session = executionContext.getSession();
@ -370,17 +376,20 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
sqmInterpretation.getSqlAst() sqmInterpretation.getSqlAst()
); );
final Map<QueryParameterImplementor<?>, Map<SqmParameter, List<List<JdbcParameter>>>> jdbcParamsXref = SqmUtil.generateJdbcParamsXref( final Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref
domainParameterXref, = SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmInterpretation::getJdbcParamsBySqmParam );
sqmInterpretation::getJdbcParamsBySqmParam
);
final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings(
executionContext.getQueryParameterBindings(), executionContext.getQueryParameterBindings(),
domainParameterXref, domainParameterXref,
jdbcParamsXref, jdbcParamsXref,
session.getFactory().getDomainModel(), session.getFactory().getDomainModel(),
tableGroupAccess::findTableGroup, tableGroupAccess::findTableGroup,
sqmInterpretation.getSqmParameterMappingModelTypeResolutions()::get, new SqmParameterMappingModelResolutionAccess() {
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) sqmInterpretation.getSqmParameterMappingModelTypeResolutions().get(parameter);
}
},
session session
); );
final JdbcSelect jdbcSelect = selectTranslator.translate( jdbcParameterBindings, executionContext.getQueryOptions() ); final JdbcSelect jdbcSelect = selectTranslator.translate( jdbcParameterBindings, executionContext.getQueryOptions() );
@ -407,16 +416,16 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
private final SelectStatement selectStatement; private final SelectStatement selectStatement;
private final JdbcSelect jdbcSelect; private final JdbcSelect jdbcSelect;
private final FromClauseAccess tableGroupAccess; private final FromClauseAccess tableGroupAccess;
private final Map<QueryParameterImplementor<?>, Map<SqmParameter, List<List<JdbcParameter>>>> jdbcParamsXref; private final Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref;
private final Map<SqmParameter, MappingModelExpressable> sqmParameterMappingModelTypes; private final Map<SqmParameter<?>, MappingModelExpressable<?>> sqmParameterMappingModelTypes;
private transient JdbcParameterBindings firstParameterBindings; private transient JdbcParameterBindings firstParameterBindings;
CacheableSqmInterpretation( CacheableSqmInterpretation(
SelectStatement selectStatement, SelectStatement selectStatement,
JdbcSelect jdbcSelect, JdbcSelect jdbcSelect,
FromClauseAccess tableGroupAccess, FromClauseAccess tableGroupAccess,
Map<QueryParameterImplementor<?>, Map<SqmParameter, List<List<JdbcParameter>>>> jdbcParamsXref, Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref,
Map<SqmParameter,MappingModelExpressable> sqmParameterMappingModelTypes, Map<SqmParameter<?>,MappingModelExpressable<?>> sqmParameterMappingModelTypes,
JdbcParameterBindings firstParameterBindings) { JdbcParameterBindings firstParameterBindings) {
this.selectStatement = selectStatement; this.selectStatement = selectStatement;
this.jdbcSelect = jdbcSelect; this.jdbcSelect = jdbcSelect;
@ -438,11 +447,11 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
return tableGroupAccess; return tableGroupAccess;
} }
Map<QueryParameterImplementor<?>, Map<SqmParameter, List<List<JdbcParameter>>>> getJdbcParamsXref() { Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> getJdbcParamsXref() {
return jdbcParamsXref; return jdbcParamsXref;
} }
public Map<SqmParameter, MappingModelExpressable> getSqmParameterMappingModelTypes() { public Map<SqmParameter<?>, MappingModelExpressable<?>> getSqmParameterMappingModelTypes() {
return sqmParameterMappingModelTypes; return sqmParameterMappingModelTypes;
} }

View File

@ -82,10 +82,10 @@ public class DomainParameterXref {
return empty(); return empty();
} }
final Map<QueryParameterImplementor<?>, List<SqmParameter>> sqmParamsByQueryParam = new IdentityHashMap<>(); final Map<QueryParameterImplementor<?>, List<SqmParameter<?>>> sqmParamsByQueryParam = new IdentityHashMap<>();
final int sqmParamCount = parameterResolutions.getSqmParameters().size(); final int sqmParamCount = parameterResolutions.getSqmParameters().size();
final Map<SqmParameter, QueryParameterImplementor<?>> queryParamBySqmParam = new IdentityHashMap<>( sqmParamCount ); final Map<SqmParameter<?>, QueryParameterImplementor<?>> queryParamBySqmParam = new IdentityHashMap<>( sqmParamCount );
for ( SqmParameter<?> sqmParameter : parameterResolutions.getSqmParameters() ) { for ( SqmParameter<?> sqmParameter : parameterResolutions.getSqmParameters() ) {
if ( sqmParameter instanceof JpaCriteriaParameter ) { if ( sqmParameter instanceof JpaCriteriaParameter ) {
@ -147,17 +147,17 @@ public class DomainParameterXref {
private final SqmStatement.ParameterResolutions parameterResolutions; private final SqmStatement.ParameterResolutions parameterResolutions;
private final Map<QueryParameterImplementor<?>, List<SqmParameter>> sqmParamsByQueryParam; private final Map<QueryParameterImplementor<?>, List<SqmParameter<?>>> sqmParamsByQueryParam;
private final Map<SqmParameter, QueryParameterImplementor<?>> queryParamBySqmParam; private final Map<SqmParameter<?>, QueryParameterImplementor<?>> queryParamBySqmParam;
private Map<SqmParameter,List<SqmParameter>> expansions; private Map<SqmParameter<?>,List<SqmParameter<?>>> expansions;
/** /**
* @implSpec Constructor is defined as public for * @implSpec Constructor is defined as public for
*/ */
public DomainParameterXref( public DomainParameterXref(
Map<QueryParameterImplementor<?>, List<SqmParameter>> sqmParamsByQueryParam, Map<QueryParameterImplementor<?>, List<SqmParameter<?>>> sqmParamsByQueryParam,
Map<SqmParameter, QueryParameterImplementor<?>> queryParamBySqmParam, Map<SqmParameter<?>, QueryParameterImplementor<?>> queryParamBySqmParam,
SqmStatement.ParameterResolutions parameterResolutions) { SqmStatement.ParameterResolutions parameterResolutions) {
this.sqmParamsByQueryParam = sqmParamsByQueryParam; this.sqmParamsByQueryParam = sqmParamsByQueryParam;
this.queryParamBySqmParam = queryParamBySqmParam; this.queryParamBySqmParam = queryParamBySqmParam;
@ -174,7 +174,7 @@ public class DomainParameterXref {
/** /**
* Get all of the QueryParameters mapped by this xref * Get all of the QueryParameters mapped by this xref
*/ */
public Map<QueryParameterImplementor<?>, List<SqmParameter>> getQueryParameters() { public Map<QueryParameterImplementor<?>, List<SqmParameter<?>>> getQueryParameters() {
return sqmParamsByQueryParam; return sqmParamsByQueryParam;
} }
@ -187,7 +187,7 @@ public class DomainParameterXref {
} }
public int getNumberOfSqmParameters(QueryParameterImplementor<?> queryParameter) { public int getNumberOfSqmParameters(QueryParameterImplementor<?> queryParameter) {
final List<SqmParameter> sqmParameters = sqmParamsByQueryParam.get( queryParameter ); final List<SqmParameter<?>> sqmParameters = sqmParamsByQueryParam.get( queryParameter );
if ( sqmParameters == null ) { if ( sqmParameters == null ) {
// this should maybe be an exception instead // this should maybe be an exception instead
return 0; return 0;
@ -199,7 +199,7 @@ public class DomainParameterXref {
* Get the mapping of all QueryParameters to the List of its corresponding * Get the mapping of all QueryParameters to the List of its corresponding
* SqmParameters * SqmParameters
*/ */
public Map<QueryParameterImplementor<?>, List<SqmParameter>> getSqmParamByQueryParam() { public Map<QueryParameterImplementor<?>, List<SqmParameter<?>>> getSqmParamByQueryParam() {
return sqmParamsByQueryParam; return sqmParamsByQueryParam;
} }
@ -207,13 +207,13 @@ public class DomainParameterXref {
return parameterResolutions; return parameterResolutions;
} }
public List<SqmParameter> getSqmParameters(QueryParameterImplementor<?> queryParameter) { public List<SqmParameter<?>> getSqmParameters(QueryParameterImplementor<?> queryParameter) {
return sqmParamsByQueryParam.get( queryParameter ); return sqmParamsByQueryParam.get( queryParameter );
} }
public QueryParameterImplementor<?> getQueryParameter(SqmParameter sqmParameter) { public QueryParameterImplementor<?> getQueryParameter(SqmParameter<?> sqmParameter) {
if ( sqmParameter instanceof SqmJpaCriteriaParameterWrapper ) { if ( sqmParameter instanceof SqmJpaCriteriaParameterWrapper ) {
return ( (SqmJpaCriteriaParameterWrapper) sqmParameter ).getJpaCriteriaParameter(); return ( (SqmJpaCriteriaParameterWrapper<?>) sqmParameter ).getJpaCriteriaParameter();
} }
else if ( sqmParameter instanceof QueryParameterImplementor<?> ) { else if ( sqmParameter instanceof QueryParameterImplementor<?> ) {
return (QueryParameterImplementor<?>) sqmParameter; return (QueryParameterImplementor<?>) sqmParameter;
@ -235,12 +235,12 @@ public class DomainParameterXref {
expansions.computeIfAbsent( originalSqmParameter, p -> new ArrayList<>() ).add( expansion ); expansions.computeIfAbsent( originalSqmParameter, p -> new ArrayList<>() ).add( expansion );
} }
public List<SqmParameter> getExpansions(SqmParameter sqmParameter) { public List<SqmParameter<?>> getExpansions(SqmParameter<?> sqmParameter) {
if ( expansions == null ) { if ( expansions == null ) {
return Collections.emptyList(); return Collections.emptyList();
} }
final List<SqmParameter> sqmParameters = expansions.get( sqmParameter ); final List<SqmParameter<?>> sqmParameters = expansions.get( sqmParameter );
return sqmParameters == null ? Collections.emptyList() : sqmParameters; return sqmParameters == null ? Collections.emptyList() : sqmParameters;
} }
@ -249,8 +249,8 @@ public class DomainParameterXref {
return; return;
} }
for ( List<SqmParameter> expansionList : expansions.values() ) { for ( List<SqmParameter<?>> expansionList : expansions.values() ) {
for ( SqmParameter expansion : expansionList ) { for ( SqmParameter<?> expansion : expansionList ) {
queryParamBySqmParam.remove( expansion ); queryParamBySqmParam.remove( expansion );
} }
} }

View File

@ -15,6 +15,7 @@ import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor; import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
import org.hibernate.metamodel.mapping.MappingModelExpressable;
import org.hibernate.metamodel.mapping.MappingModelHelper; import org.hibernate.metamodel.mapping.MappingModelHelper;
import org.hibernate.query.NavigablePath; import org.hibernate.query.NavigablePath;
import org.hibernate.query.spi.DomainQueryExecutionContext; import org.hibernate.query.spi.DomainQueryExecutionContext;
@ -22,6 +23,7 @@ import org.hibernate.query.spi.NonSelectQueryPlan;
import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.spi.QueryParameterImplementor; import org.hibernate.query.spi.QueryParameterImplementor;
import org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper; import org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper;
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
import org.hibernate.query.sqm.sql.SqmTranslation; import org.hibernate.query.sqm.sql.SqmTranslation;
import org.hibernate.query.sqm.sql.SqmTranslator; import org.hibernate.query.sqm.sql.SqmTranslator;
import org.hibernate.query.sqm.sql.SqmTranslatorFactory; import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
@ -43,16 +45,16 @@ import org.hibernate.sql.results.internal.SqlSelectionImpl;
*/ */
public class SimpleDeleteQueryPlan implements NonSelectQueryPlan { public class SimpleDeleteQueryPlan implements NonSelectQueryPlan {
private final EntityMappingType entityDescriptor; private final EntityMappingType entityDescriptor;
private final SqmDeleteStatement sqmDelete; private final SqmDeleteStatement<?> sqmDelete;
private final DomainParameterXref domainParameterXref; private final DomainParameterXref domainParameterXref;
private JdbcDelete jdbcDelete; private JdbcDelete jdbcDelete;
private SqmTranslation<DeleteStatement> sqmInterpretation; private SqmTranslation<DeleteStatement> sqmInterpretation;
private Map<QueryParameterImplementor<?>, Map<SqmParameter, List<List<JdbcParameter>>>> jdbcParamsXref; private Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref;
public SimpleDeleteQueryPlan( public SimpleDeleteQueryPlan(
EntityMappingType entityDescriptor, EntityMappingType entityDescriptor,
SqmDeleteStatement sqmDelete, SqmDeleteStatement<?> sqmDelete,
DomainParameterXref domainParameterXref) { DomainParameterXref domainParameterXref) {
assert entityDescriptor.getEntityName().equals( sqmDelete.getTarget().getEntityName() ); assert entityDescriptor.getEntityName().equals( sqmDelete.getTarget().getEntityName() );
@ -103,7 +105,12 @@ public class SimpleDeleteQueryPlan implements NonSelectQueryPlan {
jdbcParamsXref, jdbcParamsXref,
factory.getDomainModel(), factory.getDomainModel(),
sqmInterpretation.getFromClauseAccess()::findTableGroup, sqmInterpretation.getFromClauseAccess()::findTableGroup,
sqmInterpretation.getSqmParameterMappingModelTypeResolutions()::get, new SqmParameterMappingModelResolutionAccess() {
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) sqmInterpretation.getSqmParameterMappingModelTypeResolutions().get(parameter);
}
},
session session
); );

View File

@ -18,6 +18,7 @@ import org.hibernate.query.spi.DomainQueryExecutionContext;
import org.hibernate.query.spi.NonSelectQueryPlan; import org.hibernate.query.spi.NonSelectQueryPlan;
import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.spi.QueryParameterImplementor; import org.hibernate.query.spi.QueryParameterImplementor;
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
import org.hibernate.query.sqm.sql.SqmTranslation; import org.hibernate.query.sqm.sql.SqmTranslation;
import org.hibernate.query.sqm.sql.SqmTranslator; import org.hibernate.query.sqm.sql.SqmTranslator;
import org.hibernate.query.sqm.sql.SqmTranslatorFactory; import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
@ -34,16 +35,16 @@ import org.hibernate.sql.exec.spi.JdbcParameterBindings;
* @author Gavin King * @author Gavin King
*/ */
public class SimpleInsertQueryPlan implements NonSelectQueryPlan { public class SimpleInsertQueryPlan implements NonSelectQueryPlan {
private final SqmInsertStatement sqmInsert; private final SqmInsertStatement<?> sqmInsert;
private final DomainParameterXref domainParameterXref; private final DomainParameterXref domainParameterXref;
private Map<SqmParameter, MappingModelExpressable> paramTypeResolutions; private Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions;
private JdbcInsert jdbcInsert; private JdbcInsert jdbcInsert;
private FromClauseAccess tableGroupAccess; private FromClauseAccess tableGroupAccess;
private Map<QueryParameterImplementor<?>, Map<SqmParameter, List<List<JdbcParameter>>>> jdbcParamsXref; private Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref;
public SimpleInsertQueryPlan( public SimpleInsertQueryPlan(
SqmInsertStatement sqmInsert, SqmInsertStatement<?> sqmInsert,
DomainParameterXref domainParameterXref) { DomainParameterXref domainParameterXref) {
this.sqmInsert = sqmInsert; this.sqmInsert = sqmInsert;
this.domainParameterXref = domainParameterXref; this.domainParameterXref = domainParameterXref;
@ -97,7 +98,12 @@ public class SimpleInsertQueryPlan implements NonSelectQueryPlan {
jdbcParamsXref, jdbcParamsXref,
factory.getDomainModel(), factory.getDomainModel(),
tableGroupAccess::findTableGroup, tableGroupAccess::findTableGroup,
paramTypeResolutions::get, new SqmParameterMappingModelResolutionAccess() {
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) paramTypeResolutions.get(parameter);
}
},
session session
); );

View File

@ -18,6 +18,7 @@ import org.hibernate.query.spi.DomainQueryExecutionContext;
import org.hibernate.query.spi.NonSelectQueryPlan; import org.hibernate.query.spi.NonSelectQueryPlan;
import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.spi.QueryParameterImplementor; import org.hibernate.query.spi.QueryParameterImplementor;
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
import org.hibernate.query.sqm.sql.SqmTranslation; import org.hibernate.query.sqm.sql.SqmTranslation;
import org.hibernate.query.sqm.sql.SqmTranslator; import org.hibernate.query.sqm.sql.SqmTranslator;
import org.hibernate.query.sqm.sql.SqmTranslatorFactory; import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
@ -34,16 +35,16 @@ import org.hibernate.sql.exec.spi.JdbcUpdate;
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class SimpleUpdateQueryPlan implements NonSelectQueryPlan { public class SimpleUpdateQueryPlan implements NonSelectQueryPlan {
private final SqmUpdateStatement sqmUpdate; private final SqmUpdateStatement<?> sqmUpdate;
private final DomainParameterXref domainParameterXref; private final DomainParameterXref domainParameterXref;
private JdbcUpdate jdbcUpdate; private JdbcUpdate jdbcUpdate;
private FromClauseAccess tableGroupAccess; private FromClauseAccess tableGroupAccess;
private Map<QueryParameterImplementor<?>, Map<SqmParameter, List<List<JdbcParameter>>>> jdbcParamsXref; private Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref;
private Map<SqmParameter,MappingModelExpressable> sqmParamMappingTypeResolutions; private Map<SqmParameter<?>,MappingModelExpressable<?>> sqmParamMappingTypeResolutions;
public SimpleUpdateQueryPlan( public SimpleUpdateQueryPlan(
SqmUpdateStatement sqmUpdate, SqmUpdateStatement<?> sqmUpdate,
DomainParameterXref domainParameterXref) { DomainParameterXref domainParameterXref) {
this.sqmUpdate = sqmUpdate; this.sqmUpdate = sqmUpdate;
this.domainParameterXref = domainParameterXref; this.domainParameterXref = domainParameterXref;
@ -66,7 +67,12 @@ public class SimpleUpdateQueryPlan implements NonSelectQueryPlan {
jdbcParamsXref, jdbcParamsXref,
factory.getDomainModel(), factory.getDomainModel(),
tableGroupAccess::findTableGroup, tableGroupAccess::findTableGroup,
sqmParamMappingTypeResolutions::get, new SqmParameterMappingModelResolutionAccess() {
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) sqmParamMappingTypeResolutions.get(parameter);
}
},
session session
); );

View File

@ -17,7 +17,6 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Supplier;
import org.hibernate.NotYetImplementedFor6Exception; import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionFactoryImplementor;
@ -70,7 +69,7 @@ public class SqmUtil {
private SqmUtil() { private SqmUtil() {
} }
public static void verifyIsSelectStatement(SqmStatement sqm, String hqlString) { public static void verifyIsSelectStatement(SqmStatement<?> sqm, String hqlString) {
if ( !(sqm instanceof SqmSelectStatement) ) { if ( !(sqm instanceof SqmSelectStatement) ) {
throw new IllegalQueryOperationException( throw new IllegalQueryOperationException(
String.format( String.format(
@ -85,7 +84,7 @@ public class SqmUtil {
} }
} }
public static void verifyIsNonSelectStatement(SqmStatement sqm, String hqlString) { public static void verifyIsNonSelectStatement(SqmStatement<?> sqm, String hqlString) {
if ( !(sqm instanceof SqmDmlStatement) ) { if ( !(sqm instanceof SqmDmlStatement) ) {
throw new IllegalQueryOperationException( throw new IllegalQueryOperationException(
String.format( String.format(
@ -100,7 +99,7 @@ public class SqmUtil {
} }
} }
public static Map<QueryParameterImplementor<?>, Map<SqmParameter, List<List<JdbcParameter>>>> generateJdbcParamsXref( public static Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> generateJdbcParamsXref(
DomainParameterXref domainParameterXref, DomainParameterXref domainParameterXref,
JdbcParameterBySqmParameterAccess jdbcParameterBySqmParameterAccess) { JdbcParameterBySqmParameterAccess jdbcParameterBySqmParameterAccess) {
if ( domainParameterXref == null || !domainParameterXref.hasParameters() ) { if ( domainParameterXref == null || !domainParameterXref.hasParameters() ) {
@ -108,23 +107,23 @@ public class SqmUtil {
} }
final int queryParameterCount = domainParameterXref.getQueryParameterCount(); final int queryParameterCount = domainParameterXref.getQueryParameterCount();
final Map<QueryParameterImplementor<?>, Map<SqmParameter, List<List<JdbcParameter>>>> result = new IdentityHashMap<>( queryParameterCount ); final Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> result = new IdentityHashMap<>( queryParameterCount );
for ( Map.Entry<QueryParameterImplementor<?>, List<SqmParameter>> entry : domainParameterXref.getSqmParamByQueryParam().entrySet() ) { for ( Map.Entry<QueryParameterImplementor<?>, List<SqmParameter<?>>> entry : domainParameterXref.getSqmParamByQueryParam().entrySet() ) {
final QueryParameterImplementor<?> queryParam = entry.getKey(); final QueryParameterImplementor<?> queryParam = entry.getKey();
final List<SqmParameter> sqmParams = entry.getValue(); final List<SqmParameter<?>> sqmParams = entry.getValue();
final Map<SqmParameter, List<List<JdbcParameter>>> sqmParamMap = result.computeIfAbsent( final Map<SqmParameter<?>, List<List<JdbcParameter>>> sqmParamMap = result.computeIfAbsent(
queryParam, queryParam,
qp -> new IdentityHashMap<>( sqmParams.size() ) qp -> new IdentityHashMap<>( sqmParams.size() )
); );
for ( SqmParameter sqmParam : sqmParams ) { for ( SqmParameter<?> sqmParam : sqmParams ) {
sqmParamMap.put( sqmParam, jdbcParameterBySqmParameterAccess.getJdbcParamsBySqmParam().get( sqmParam ) ); sqmParamMap.put( sqmParam, jdbcParameterBySqmParameterAccess.getJdbcParamsBySqmParam().get( sqmParam ) );
final List<SqmParameter> expansions = domainParameterXref.getExpansions( sqmParam ); final List<SqmParameter<?>> expansions = domainParameterXref.getExpansions( sqmParam );
if ( ! expansions.isEmpty() ) { if ( ! expansions.isEmpty() ) {
for ( SqmParameter expansion : expansions ) { for ( SqmParameter<?> expansion : expansions ) {
sqmParamMap.put( expansion, jdbcParameterBySqmParameterAccess.getJdbcParamsBySqmParam().get( expansion ) ); sqmParamMap.put( expansion, jdbcParameterBySqmParameterAccess.getJdbcParamsBySqmParam().get( expansion ) );
result.put( queryParam, sqmParamMap ); result.put( queryParam, sqmParamMap );
} }
@ -178,7 +177,7 @@ public class SqmUtil {
public static JdbcParameterBindings createJdbcParameterBindings( public static JdbcParameterBindings createJdbcParameterBindings(
QueryParameterBindings domainParamBindings, QueryParameterBindings domainParamBindings,
DomainParameterXref domainParameterXref, DomainParameterXref domainParameterXref,
Map<QueryParameterImplementor<?>, Map<SqmParameter, List<List<JdbcParameter>>>> jdbcParamXref, Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamXref,
MappingMetamodel domainModel, MappingMetamodel domainModel,
Function<NavigablePath, TableGroup> tableGroupLocator, Function<NavigablePath, TableGroup> tableGroupLocator,
SqmParameterMappingModelResolutionAccess mappingModelResolutionAccess, SqmParameterMappingModelResolutionAccess mappingModelResolutionAccess,
@ -187,15 +186,15 @@ public class SqmUtil {
domainParameterXref.getSqmParameterCount() domainParameterXref.getSqmParameterCount()
); );
for ( Map.Entry<QueryParameterImplementor<?>, List<SqmParameter>> entry : for ( Map.Entry<QueryParameterImplementor<?>, List<SqmParameter<?>>> entry :
domainParameterXref.getSqmParamByQueryParam().entrySet() ) { domainParameterXref.getSqmParamByQueryParam().entrySet() ) {
final QueryParameterImplementor<?> queryParam = entry.getKey(); final QueryParameterImplementor<?> queryParam = entry.getKey();
final List<SqmParameter> sqmParameters = entry.getValue(); final List<SqmParameter<?>> sqmParameters = entry.getValue();
final QueryParameterBinding<?> domainParamBinding = domainParamBindings.getBinding( queryParam ); final QueryParameterBinding<?> domainParamBinding = domainParamBindings.getBinding( queryParam );
final Map<SqmParameter, List<List<JdbcParameter>>> jdbcParamMap = jdbcParamXref.get( queryParam ); final Map<SqmParameter<?>, List<List<JdbcParameter>>> jdbcParamMap = jdbcParamXref.get( queryParam );
sqm_params: for ( SqmParameter sqmParameter : sqmParameters ) { for ( SqmParameter<?> sqmParameter : sqmParameters ) {
final Bindable parameterType = determineParameterType( final Bindable parameterType = determineParameterType(
domainParamBinding, domainParamBinding,
queryParam, queryParam,
@ -211,12 +210,12 @@ public class SqmUtil {
continue; continue;
} }
if ( !domainParamBinding.isBound() ) { if ( !domainParamBinding.isBound() ) {
final MappingModelExpressable mappingExpressable = SqmMappingModelHelper.resolveMappingModelExpressable( final MappingModelExpressable<?> mappingExpressable = SqmMappingModelHelper.resolveMappingModelExpressable(
sqmParameter, sqmParameter,
domainModel, domainModel,
tableGroupLocator tableGroupLocator
); );
jdbc_params: for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) { for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get( i ); final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get( i );
mappingExpressable.forEachJdbcType( mappingExpressable.forEachJdbcType(
(position, jdbcType) -> { (position, jdbcType) -> {
@ -248,11 +247,11 @@ public class SqmUtil {
} }
// an then one for each of the expansions // an then one for each of the expansions
final List<SqmParameter> expansions = domainParameterXref.getExpansions( sqmParameter ); final List<SqmParameter<?>> expansions = domainParameterXref.getExpansions( sqmParameter );
assert expansions.size() == bindValues.size() - 1; assert expansions.size() == bindValues.size() - 1;
int expansionPosition = 0; int expansionPosition = 0;
while ( valueItr.hasNext() ) { while ( valueItr.hasNext() ) {
final SqmParameter expansionSqmParam = expansions.get( expansionPosition++ ); final SqmParameter<?> expansionSqmParam = expansions.get( expansionPosition++ );
final List<List<JdbcParameter>> jdbcParamBinds = jdbcParamMap.get( expansionSqmParam ); final List<List<JdbcParameter>> jdbcParamBinds = jdbcParamMap.get( expansionSqmParam );
for ( int i = 0; i < jdbcParamBinds.size(); i++ ) { for ( int i = 0; i < jdbcParamBinds.size(); i++ ) {
List<JdbcParameter> expansionJdbcParams = jdbcParamBinds.get( i ); List<JdbcParameter> expansionJdbcParams = jdbcParamBinds.get( i );
@ -287,7 +286,7 @@ public class SqmUtil {
final JdbcMapping jdbcMapping; final JdbcMapping jdbcMapping;
if ( domainParamBinding.getType() instanceof AttributeConverterTypeAdapter ) { if ( domainParamBinding.getType() instanceof AttributeConverterTypeAdapter ) {
final AttributeConverterTypeAdapter adapter = (AttributeConverterTypeAdapter) domainParamBinding.getType(); final AttributeConverterTypeAdapter<?> adapter = (AttributeConverterTypeAdapter<?>) domainParamBinding.getType();
valueConverter = adapter.getAttributeConverter(); valueConverter = adapter.getAttributeConverter();
jdbcMapping = adapter.getJdbcMapping(); jdbcMapping = adapter.getJdbcMapping();
} }
@ -310,7 +309,7 @@ public class SqmUtil {
); );
} }
continue sqm_params; continue;
} }
} }
@ -394,7 +393,7 @@ public class SqmUtil {
public static Bindable determineParameterType( public static Bindable determineParameterType(
QueryParameterBinding<?> binding, QueryParameterBinding<?> binding,
QueryParameterImplementor<?> parameter, QueryParameterImplementor<?> parameter,
List<SqmParameter> sqmParameters, List<SqmParameter<?>> sqmParameters,
SqmParameterMappingModelResolutionAccess mappingModelResolutionAccess, SqmParameterMappingModelResolutionAccess mappingModelResolutionAccess,
SessionFactoryImplementor sessionFactory) { SessionFactoryImplementor sessionFactory) {
if ( binding.getType() != null ) { if ( binding.getType() != null ) {

View File

@ -19,12 +19,14 @@ import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.MappingModelExpressable;
import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.metamodel.model.domain.EntityDomainType; import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.query.spi.DomainQueryExecutionContext; import org.hibernate.query.spi.DomainQueryExecutionContext;
import org.hibernate.query.sqm.internal.DomainParameterXref; import org.hibernate.query.sqm.internal.DomainParameterXref;
import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter; import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter;
import org.hibernate.query.sqm.internal.SqmUtil; import org.hibernate.query.sqm.internal.SqmUtil;
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
import org.hibernate.query.sqm.sql.internal.SqlAstQueryPartProcessingStateImpl; import org.hibernate.query.sqm.sql.internal.SqlAstQueryPartProcessingStateImpl;
import org.hibernate.query.sqm.tree.SqmDeleteOrUpdateStatement; import org.hibernate.query.sqm.tree.SqmDeleteOrUpdateStatement;
import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.expression.SqmParameter;
@ -281,10 +283,16 @@ public class MatchingIdSelectionHelper {
final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings(
executionContext.getQueryParameterBindings(), executionContext.getQueryParameterBindings(),
domainParameterXref, domainParameterXref,
SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmConverter ), SqmUtil.generateJdbcParamsXref(domainParameterXref, sqmConverter),
factory.getDomainModel(), factory.getDomainModel(),
navigablePath -> sqmConverter.getMutatingTableGroup(), navigablePath -> sqmConverter.getMutatingTableGroup(),
sqmConverter.getSqmParameterMappingModelExpressableResolutions()::get, new SqmParameterMappingModelResolutionAccess() {
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) sqmConverter.getSqmParameterMappingModelExpressableResolutions().get(parameter);
}
}
,
executionContext.getSession() executionContext.getSession()
); );
final LockOptions lockOptions = executionContext.getQueryOptions().getLockOptions(); final LockOptions lockOptions = executionContext.getQueryOptions().getLockOptions();

View File

@ -57,7 +57,7 @@ import org.hibernate.sql.ast.tree.update.Assignment;
*/ */
public class MultiTableSqmMutationConverter extends BaseSqmToSqlAstConverter<Statement> { public class MultiTableSqmMutationConverter extends BaseSqmToSqlAstConverter<Statement> {
public interface SqmParameterResolutionConsumer { public interface SqmParameterResolutionConsumer {
void accept(SqmParameter sqmParam, MappingModelExpressable mappingType, List<JdbcParameter> jdbcParameters); void accept(SqmParameter<?> sqmParam, MappingModelExpressable<?> mappingType, List<JdbcParameter> jdbcParameters);
} }
private final EntityMappingType mutatingEntityDescriptor; private final EntityMappingType mutatingEntityDescriptor;
@ -231,7 +231,7 @@ public class MultiTableSqmMutationConverter extends BaseSqmToSqlAstConverter<Sta
} }
@Override @Override
protected Expression consumeSingleSqmParameter(SqmParameter sqmParameter) { protected Expression consumeSingleSqmParameter(SqmParameter<?> sqmParameter) {
assert parameterResolutionConsumer != null; assert parameterResolutionConsumer != null;
final Expression expression = super.consumeSingleSqmParameter( sqmParameter ); final Expression expression = super.consumeSingleSqmParameter( sqmParameter );

View File

@ -49,6 +49,7 @@ import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter;
import org.hibernate.query.sqm.internal.SqmUtil; import org.hibernate.query.sqm.internal.SqmUtil;
import org.hibernate.query.sqm.mutation.internal.InsertHandler; import org.hibernate.query.sqm.mutation.internal.InsertHandler;
import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter; import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter;
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
import org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter; import org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter;
import org.hibernate.query.sqm.tree.cte.SqmCteTable; import org.hibernate.query.sqm.tree.cte.SqmCteTable;
import org.hibernate.query.sqm.tree.cte.SqmCteTableColumn; import org.hibernate.query.sqm.tree.cte.SqmCteTableColumn;
@ -173,7 +174,7 @@ public class CteInsertHandler implements InsertHandler {
); );
final TableGroup insertingTableGroup = sqmConverter.getMutatingTableGroup(); final TableGroup insertingTableGroup = sqmConverter.getMutatingTableGroup();
final Map<SqmParameter, List<List<JdbcParameter>>> parameterResolutions; final Map<SqmParameter<?>, List<List<JdbcParameter>>> parameterResolutions;
if ( domainParameterXref.getSqmParameterCount() == 0 ) { if ( domainParameterXref.getSqmParameterCount() == 0 ) {
parameterResolutions = Collections.emptyMap(); parameterResolutions = Collections.emptyMap();
} }
@ -188,7 +189,7 @@ public class CteInsertHandler implements InsertHandler {
final int size = sqmStatement.getInsertionTargetPaths().size(); final int size = sqmStatement.getInsertionTargetPaths().size();
final List<Map.Entry<SqmCteTableColumn, Assignment>> targetPathColumns = new ArrayList<>( size ); final List<Map.Entry<SqmCteTableColumn, Assignment>> targetPathColumns = new ArrayList<>( size );
final List<SqmCteTableColumn> targetPathSqmCteColumns = new ArrayList<>( size ); final List<SqmCteTableColumn> targetPathSqmCteColumns = new ArrayList<>( size );
final Map<SqmParameter, MappingModelExpressable> paramTypeResolutions = new LinkedHashMap<>(); final Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions = new LinkedHashMap<>();
final NamedTableReference entityTableReference = new NamedTableReference( final NamedTableReference entityTableReference = new NamedTableReference(
cteTable.getCteName(), cteTable.getCteName(),
TemporaryTable.DEFAULT_ALIAS, TemporaryTable.DEFAULT_ALIAS,
@ -629,7 +630,7 @@ public class CteInsertHandler implements InsertHandler {
final Expression count = createCountStar( factory, sqmConverter ); final Expression count = createCountStar( factory, sqmConverter );
domainResults.add( domainResults.add(
new BasicResult<>( new BasicResult(
0, 0,
null, null,
( (SqlExpressable) count).getJdbcMapping().getJavaTypeDescriptor() ( (SqlExpressable) count).getJdbcMapping().getJavaTypeDescriptor()
@ -656,10 +657,15 @@ public class CteInsertHandler implements InsertHandler {
final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings(
executionContext.getQueryParameterBindings(), executionContext.getQueryParameterBindings(),
domainParameterXref, domainParameterXref,
SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmConverter ), SqmUtil.generateJdbcParamsXref(domainParameterXref, sqmConverter),
factory.getDomainModel(), factory.getDomainModel(),
navigablePath -> sqmConverter.getMutatingTableGroup(), navigablePath -> sqmConverter.getMutatingTableGroup(),
paramTypeResolutions::get, new SqmParameterMappingModelResolutionAccess() {
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) paramTypeResolutions.get(parameter);
}
},
executionContext.getSession() executionContext.getSession()
); );
final JdbcSelect select = translator.translate( jdbcParameterBindings, executionContext.getQueryOptions() ); final JdbcSelect select = translator.translate( jdbcParameterBindings, executionContext.getQueryOptions() );
@ -694,7 +700,7 @@ public class CteInsertHandler implements InsertHandler {
List<Map.Entry<SqmCteTableColumn, Assignment>> assignments, List<Map.Entry<SqmCteTableColumn, Assignment>> assignments,
boolean assignsId, boolean assignsId,
MultiTableSqmMutationConverter sqmConverter, MultiTableSqmMutationConverter sqmConverter,
Map<SqmParameter, List<List<JdbcParameter>>> parameterResolutions, Map<SqmParameter<?>, List<List<JdbcParameter>>> parameterResolutions,
SessionFactoryImplementor factory) { SessionFactoryImplementor factory) {
final TableGroup updatingTableGroup = sqmConverter.getMutatingTableGroup(); final TableGroup updatingTableGroup = sqmConverter.getMutatingTableGroup();
final EntityMappingType entityDescriptor = getEntityDescriptor(); final EntityMappingType entityDescriptor = getEntityDescriptor();

View File

@ -42,6 +42,7 @@ import org.hibernate.query.spi.DomainQueryExecutionContext;
import org.hibernate.query.sqm.internal.DomainParameterXref; import org.hibernate.query.sqm.internal.DomainParameterXref;
import org.hibernate.query.sqm.internal.SqmUtil; import org.hibernate.query.sqm.internal.SqmUtil;
import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter; import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter;
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.query.sqm.tree.insert.SqmInsertStatement; import org.hibernate.query.sqm.tree.insert.SqmInsertStatement;
import org.hibernate.sql.ast.tree.expression.ColumnReference; import org.hibernate.sql.ast.tree.expression.ColumnReference;
@ -89,7 +90,7 @@ public class InsertExecutionDelegate implements TableBasedInsertHandler.Executio
private final JdbcParameterBindings jdbcParameterBindings; private final JdbcParameterBindings jdbcParameterBindings;
private final Map<TableReference, List<Assignment>> assignmentsByTable; private final Map<TableReference, List<Assignment>> assignmentsByTable;
private final Map<SqmParameter, MappingModelExpressable> paramTypeResolutions; private final Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions;
private final SessionFactoryImplementor sessionFactory; private final SessionFactoryImplementor sessionFactory;
public InsertExecutionDelegate( public InsertExecutionDelegate(
@ -103,8 +104,8 @@ public class InsertExecutionDelegate implements TableBasedInsertHandler.Executio
Map<String, TableReference> tableReferenceByAlias, Map<String, TableReference> tableReferenceByAlias,
List<Assignment> assignments, List<Assignment> assignments,
InsertStatement insertStatement, InsertStatement insertStatement,
Map<SqmParameter, List<List<JdbcParameter>>> parameterResolutions, Map<SqmParameter<?>, List<List<JdbcParameter>>> parameterResolutions,
Map<SqmParameter, MappingModelExpressable> paramTypeResolutions, Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions,
DomainQueryExecutionContext executionContext) { DomainQueryExecutionContext executionContext) {
this.sqmInsert = sqmInsert; this.sqmInsert = sqmInsert;
this.sqmConverter = sqmConverter; this.sqmConverter = sqmConverter;
@ -134,7 +135,13 @@ public class InsertExecutionDelegate implements TableBasedInsertHandler.Executio
), ),
sessionFactory.getDomainModel(), sessionFactory.getDomainModel(),
navigablePath -> insertingTableGroup, navigablePath -> insertingTableGroup,
paramTypeResolutions::get, new SqmParameterMappingModelResolutionAccess() {
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) paramTypeResolutions.get(parameter);
}
}
,
executionContext.getSession() executionContext.getSession()
); );

View File

@ -39,6 +39,7 @@ import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter;
import org.hibernate.query.sqm.internal.SqmUtil; import org.hibernate.query.sqm.internal.SqmUtil;
import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter; import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter;
import org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper; import org.hibernate.query.sqm.mutation.internal.SqmMutationStrategyHelper;
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement; import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement;
import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.spi.SqlExpressionResolver;
@ -121,8 +122,8 @@ public class RestrictedDeleteExecutionDelegate implements TableBasedDeleteHandle
); );
assert hierarchyRootTableReference != null; assert hierarchyRootTableReference != null;
final Map<SqmParameter, List<List<JdbcParameter>>> parameterResolutions; final Map<SqmParameter<?>, List<List<JdbcParameter>>> parameterResolutions;
final Map<SqmParameter, MappingModelExpressable> paramTypeResolutions; final Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions;
if ( domainParameterXref.getSqmParameterCount() == 0 ) { if ( domainParameterXref.getSqmParameterCount() == 0 ) {
parameterResolutions = Collections.emptyMap(); parameterResolutions = Collections.emptyMap();
@ -203,8 +204,8 @@ public class RestrictedDeleteExecutionDelegate implements TableBasedDeleteHandle
private int executeWithoutIdTable( private int executeWithoutIdTable(
Predicate suppliedPredicate, Predicate suppliedPredicate,
TableGroup tableGroup, TableGroup tableGroup,
Map<SqmParameter, List<List<JdbcParameter>>> restrictionSqmParameterResolutions, Map<SqmParameter<?>, List<List<JdbcParameter>>> restrictionSqmParameterResolutions,
Map<SqmParameter, MappingModelExpressable> paramTypeResolutions, Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions,
SqlExpressionResolver sqlExpressionResolver, SqlExpressionResolver sqlExpressionResolver,
ExecutionContext executionContext) { ExecutionContext executionContext) {
assert entityDescriptor == entityDescriptor.getRootEntityDescriptor(); assert entityDescriptor == entityDescriptor.getRootEntityDescriptor();
@ -234,7 +235,12 @@ public class RestrictedDeleteExecutionDelegate implements TableBasedDeleteHandle
), ),
sessionFactory.getDomainModel(), sessionFactory.getDomainModel(),
navigablePath -> tableGroup, navigablePath -> tableGroup,
paramTypeResolutions::get, new SqmParameterMappingModelResolutionAccess() {
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) paramTypeResolutions.get(parameter);
}
},
executionContext.getSession() executionContext.getSession()
); );
@ -466,8 +472,8 @@ public class RestrictedDeleteExecutionDelegate implements TableBasedDeleteHandle
private int executeWithIdTable( private int executeWithIdTable(
Predicate predicate, Predicate predicate,
TableGroup deletingTableGroup, TableGroup deletingTableGroup,
Map<SqmParameter, List<List<JdbcParameter>>> restrictionSqmParameterResolutions, Map<SqmParameter<?>, List<List<JdbcParameter>>> restrictionSqmParameterResolutions,
Map<SqmParameter, MappingModelExpressable> paramTypeResolutions, Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions,
ExecutionContext executionContext) { ExecutionContext executionContext) {
final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings(
executionContext.getQueryParameterBindings(), executionContext.getQueryParameterBindings(),
@ -478,7 +484,12 @@ public class RestrictedDeleteExecutionDelegate implements TableBasedDeleteHandle
), ),
sessionFactory.getDomainModel(), sessionFactory.getDomainModel(),
navigablePath -> deletingTableGroup, navigablePath -> deletingTableGroup,
paramTypeResolutions::get, new SqmParameterMappingModelResolutionAccess() {
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) paramTypeResolutions.get(parameter);
}
},
executionContext.getSession() executionContext.getSession()
); );

View File

@ -80,7 +80,7 @@ public class TableBasedDeleteHandler
} }
@Override @Override
public SqmDeleteStatement getSqmDeleteOrUpdateStatement() { public SqmDeleteStatement<?> getSqmDeleteOrUpdateStatement() {
return (SqmDeleteStatement) super.getSqmDeleteOrUpdateStatement(); return (SqmDeleteStatement<?>) super.getSqmDeleteOrUpdateStatement();
} }
} }

View File

@ -129,7 +129,7 @@ public class TableBasedInsertHandler implements InsertHandler {
final TableGroup insertingTableGroup = converterDelegate.getMutatingTableGroup(); final TableGroup insertingTableGroup = converterDelegate.getMutatingTableGroup();
final Map<SqmParameter, List<List<JdbcParameter>>> parameterResolutions; final Map<SqmParameter<?>, List<List<JdbcParameter>>> parameterResolutions;
if ( domainParameterXref.getSqmParameterCount() == 0 ) { if ( domainParameterXref.getSqmParameterCount() == 0 ) {
parameterResolutions = Collections.emptyMap(); parameterResolutions = Collections.emptyMap();
} }
@ -142,7 +142,7 @@ public class TableBasedInsertHandler implements InsertHandler {
// information about the target paths // information about the target paths
final List<Assignment> targetPathColumns = new ArrayList<>(); final List<Assignment> targetPathColumns = new ArrayList<>();
final Map<SqmParameter, MappingModelExpressable> paramTypeResolutions = new LinkedHashMap<>(); final Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions = new LinkedHashMap<>();
final NamedTableReference entityTableReference = new NamedTableReference( final NamedTableReference entityTableReference = new NamedTableReference(
entityTable.getTableExpression(), entityTable.getTableExpression(),
TemporaryTable.DEFAULT_ALIAS, TemporaryTable.DEFAULT_ALIAS,

View File

@ -79,13 +79,13 @@ public class TableBasedUpdateHandler
this.entityDescriptor = sessionFactory.getDomainModel().getEntityDescriptor( targetEntityName ); this.entityDescriptor = sessionFactory.getDomainModel().getEntityDescriptor( targetEntityName );
} }
protected SqmUpdateStatement getSqmUpdate() { protected SqmUpdateStatement<?> getSqmUpdate() {
return getSqmDeleteOrUpdateStatement(); return getSqmDeleteOrUpdateStatement();
} }
@Override @Override
public SqmUpdateStatement getSqmDeleteOrUpdateStatement() { public SqmUpdateStatement<?> getSqmDeleteOrUpdateStatement() {
return (SqmUpdateStatement) super.getSqmDeleteOrUpdateStatement(); return (SqmUpdateStatement<?>) super.getSqmDeleteOrUpdateStatement();
} }
@ -131,7 +131,7 @@ public class TableBasedUpdateHandler
); );
assert hierarchyRootTableReference != null; assert hierarchyRootTableReference != null;
final Map<SqmParameter, List<List<JdbcParameter>>> parameterResolutions; final Map<SqmParameter<?>, List<List<JdbcParameter>>> parameterResolutions;
if ( domainParameterXref.getSqmParameterCount() == 0 ) { if ( domainParameterXref.getSqmParameterCount() == 0 ) {
parameterResolutions = Collections.emptyMap(); parameterResolutions = Collections.emptyMap();
} }
@ -144,7 +144,7 @@ public class TableBasedUpdateHandler
// information about the assignments // information about the assignments
final List<Assignment> assignments = new ArrayList<>(); final List<Assignment> assignments = new ArrayList<>();
final Map<SqmParameter, MappingModelExpressable> paramTypeResolutions = new LinkedHashMap<>(); final Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions = new LinkedHashMap<>();
converterDelegate.visitSetClause( converterDelegate.visitSetClause(
getSqmDeleteOrUpdateStatement().getSetClause(), getSqmDeleteOrUpdateStatement().getSetClause(),

View File

@ -27,6 +27,7 @@ import org.hibernate.query.spi.DomainQueryExecutionContext;
import org.hibernate.query.sqm.internal.DomainParameterXref; import org.hibernate.query.sqm.internal.DomainParameterXref;
import org.hibernate.query.sqm.internal.SqmUtil; import org.hibernate.query.sqm.internal.SqmUtil;
import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter; import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter;
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.query.sqm.tree.update.SqmUpdateStatement; import org.hibernate.query.sqm.tree.update.SqmUpdateStatement;
import org.hibernate.sql.ast.tree.expression.ColumnReference; import org.hibernate.sql.ast.tree.expression.ColumnReference;
@ -48,7 +49,7 @@ import org.hibernate.sql.exec.spi.JdbcUpdate;
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class UpdateExecutionDelegate implements TableBasedUpdateHandler.ExecutionDelegate { public class UpdateExecutionDelegate implements TableBasedUpdateHandler.ExecutionDelegate {
private final SqmUpdateStatement sqmUpdate; private final SqmUpdateStatement<?> sqmUpdate;
private final MultiTableSqmMutationConverter sqmConverter; private final MultiTableSqmMutationConverter sqmConverter;
private final TemporaryTable idTable; private final TemporaryTable idTable;
private final AfterUseAction afterUseAction; private final AfterUseAction afterUseAction;
@ -62,7 +63,7 @@ public class UpdateExecutionDelegate implements TableBasedUpdateHandler.Executio
private final JdbcParameterBindings jdbcParameterBindings; private final JdbcParameterBindings jdbcParameterBindings;
private final Map<TableReference, List<Assignment>> assignmentsByTable; private final Map<TableReference, List<Assignment>> assignmentsByTable;
private final Map<SqmParameter, MappingModelExpressable> paramTypeResolutions; private final Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions;
private final SessionFactoryImplementor sessionFactory; private final SessionFactoryImplementor sessionFactory;
public UpdateExecutionDelegate( public UpdateExecutionDelegate(
@ -77,8 +78,8 @@ public class UpdateExecutionDelegate implements TableBasedUpdateHandler.Executio
Map<String, TableReference> tableReferenceByAlias, Map<String, TableReference> tableReferenceByAlias,
List<Assignment> assignments, List<Assignment> assignments,
Predicate suppliedPredicate, Predicate suppliedPredicate,
Map<SqmParameter, List<List<JdbcParameter>>> parameterResolutions, Map<SqmParameter<?>, List<List<JdbcParameter>>> parameterResolutions,
Map<SqmParameter, MappingModelExpressable> paramTypeResolutions, Map<SqmParameter<?>, MappingModelExpressable<?>> paramTypeResolutions,
DomainQueryExecutionContext executionContext) { DomainQueryExecutionContext executionContext) {
this.sqmUpdate = sqmUpdate; this.sqmUpdate = sqmUpdate;
this.sqmConverter = sqmConverter; this.sqmConverter = sqmConverter;
@ -108,7 +109,12 @@ public class UpdateExecutionDelegate implements TableBasedUpdateHandler.Executio
), ),
sessionFactory.getDomainModel(), sessionFactory.getDomainModel(),
navigablePath -> updatingTableGroup, navigablePath -> updatingTableGroup,
paramTypeResolutions::get, new SqmParameterMappingModelResolutionAccess() {
@Override @SuppressWarnings("unchecked")
public <T> MappingModelExpressable<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
return (MappingModelExpressable<T>) paramTypeResolutions.get(parameter);
}
},
executionContext.getSession() executionContext.getSession()
); );

View File

@ -134,14 +134,14 @@ public class PatternRenderer {
@SuppressWarnings({ "UnusedDeclaration" }) @SuppressWarnings({ "UnusedDeclaration" })
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> args, List<? extends SqlAstNode> args,
SqlAstTranslator<?> translator) { SqlAstTranslator<?> translator) {
render( sqlAppender, args, null, translator ); render( sqlAppender, args, null, translator );
} }
public void render( public void render(
SqlAppender sqlAppender, SqlAppender sqlAppender,
List<SqlAstNode> args, List<? extends SqlAstNode> args,
Predicate filter, Predicate filter,
SqlAstTranslator<?> translator) { SqlAstTranslator<?> translator) {
final int numberOfArguments = args.size(); final int numberOfArguments = args.size();

View File

@ -22,5 +22,5 @@ public interface JdbcParameterBySqmParameterAccess {
/** /**
* The mapping between an SqmParameter and all of its JDBC parameters * The mapping between an SqmParameter and all of its JDBC parameters
*/ */
Map<SqmParameter, List<List<JdbcParameter>>> getJdbcParamsBySqmParam(); Map<SqmParameter<?>, List<List<JdbcParameter>>> getJdbcParamsBySqmParam();
} }

View File

@ -233,7 +233,6 @@ import org.hibernate.sql.ast.spi.SqlAstQueryPartProcessingState;
import org.hibernate.sql.ast.spi.SqlAstTreeHelper; import org.hibernate.sql.ast.spi.SqlAstTreeHelper;
import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.spi.SqlExpressionResolver;
import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.spi.SqlSelection;
import org.hibernate.sql.ast.tree.SqlAstNode;
import org.hibernate.sql.ast.tree.Statement; import org.hibernate.sql.ast.tree.Statement;
import org.hibernate.sql.ast.tree.cte.CteColumn; import org.hibernate.sql.ast.tree.cte.CteColumn;
import org.hibernate.sql.ast.tree.cte.CteStatement; import org.hibernate.sql.ast.tree.cte.CteStatement;
@ -349,7 +348,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
private final DomainParameterXref domainParameterXref; private final DomainParameterXref domainParameterXref;
private final QueryParameterBindings domainParameterBindings; private final QueryParameterBindings domainParameterBindings;
private final Map<SqmParameter,MappingModelExpressable> sqmParameterMappingModelTypes = new LinkedHashMap<>(); private final Map<SqmParameter<?>,MappingModelExpressable<?>> sqmParameterMappingModelTypes = new LinkedHashMap<>();
private final Map<JpaCriteriaParameter<?>, SqmJpaCriteriaParameterWrapper<?>> jpaCriteriaParamResolutions; private final Map<JpaCriteriaParameter<?>, SqmJpaCriteriaParameterWrapper<?>> jpaCriteriaParamResolutions;
private final List<DomainResult<?>> domainResults; private final List<DomainResult<?>> domainResults;
private final EntityGraphTraversalState entityGraphTraversalState; private final EntityGraphTraversalState entityGraphTraversalState;
@ -437,7 +436,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
.getJpaCriteriaParamResolutions(); .getJpaCriteriaParamResolutions();
} }
public Map<SqmParameter, MappingModelExpressable> getSqmParameterMappingModelExpressableResolutions() { public Map<SqmParameter<?>,MappingModelExpressable<?>> getSqmParameterMappingModelExpressableResolutions() {
return sqmParameterMappingModelTypes; return sqmParameterMappingModelTypes;
} }
@ -597,7 +596,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
// Update statement // Update statement
@Override @Override
public UpdateStatement visitUpdateStatement(SqmUpdateStatement sqmStatement) { public UpdateStatement visitUpdateStatement(SqmUpdateStatement<?> sqmStatement) {
Map<String, CteStatement> cteStatements = this.visitCteContainer( sqmStatement ); Map<String, CteStatement> cteStatements = this.visitCteContainer( sqmStatement );
final SqmRoot<?> sqmTarget = sqmStatement.getTarget(); final SqmRoot<?> sqmTarget = sqmStatement.getTarget();
@ -754,9 +753,9 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
getFromClauseIndex() getFromClauseIndex()
); );
final SqmPathInterpretation assignedPathInterpretation; final SqmPathInterpretation<?> assignedPathInterpretation;
try { try {
assignedPathInterpretation = (SqmPathInterpretation) sqmAssignment.getTargetPath().accept( this ); assignedPathInterpretation = (SqmPathInterpretation<?>) sqmAssignment.getTargetPath().accept( this );
} }
finally { finally {
popProcessingStateStack(); popProcessingStateStack();
@ -764,7 +763,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
inferrableTypeAccessStack.push( assignedPathInterpretation::getExpressionType ); inferrableTypeAccessStack.push( assignedPathInterpretation::getExpressionType );
final List<ColumnReference> valueColumnReferences = new ArrayList<>(); // final List<ColumnReference> valueColumnReferences = new ArrayList<>();
pushProcessingState( pushProcessingState(
new SqlAstProcessingStateImpl( new SqlAstProcessingStateImpl(
getCurrentProcessingState(), getCurrentProcessingState(),
@ -778,7 +777,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
.getSqlExpressionResolver() .getSqlExpressionResolver()
.resolveSqlExpression( key, creator ); .resolveSqlExpression( key, creator );
assert expression instanceof ColumnReference; assert expression instanceof ColumnReference;
valueColumnReferences.add( (ColumnReference) expression ); // valueColumnReferences.add( (ColumnReference) expression );
return expression; return expression;
} }
}, },
@ -858,7 +857,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
true, true,
rootPath, rootPath,
statement.getRoot().getAlias(), statement.getRoot().getAlias(),
() -> predicate -> additionalRestrictions = SqlAstTreeHelper.combinePredicates( additionalRestrictions, predicate ), () -> predicate -> additionalRestrictions
= SqlAstTreeHelper.combinePredicates( additionalRestrictions, predicate ),
this, this,
getCreationContext() getCreationContext()
); );
@ -937,7 +937,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
true, true,
rootPath, rootPath,
sqmStatement.getTarget().getExplicitAlias(), sqmStatement.getTarget().getExplicitAlias(),
() -> predicate -> additionalRestrictions = SqlAstTreeHelper.combinePredicates( additionalRestrictions, predicate ), () -> predicate -> additionalRestrictions
= SqlAstTreeHelper.combinePredicates( additionalRestrictions, predicate ),
this, this,
getCreationContext() getCreationContext()
); );
@ -1011,7 +1012,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
true, true,
rootPath, rootPath,
sqmStatement.getTarget().getExplicitAlias(), sqmStatement.getTarget().getExplicitAlias(),
() -> predicate -> additionalRestrictions = SqlAstTreeHelper.combinePredicates( additionalRestrictions, predicate ), () -> predicate -> additionalRestrictions
= SqlAstTreeHelper.combinePredicates( additionalRestrictions, predicate ),
this, this,
getCreationContext() getCreationContext()
); );
@ -1042,8 +1044,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
throw new SemanticException( "Not expecting multiple table references for an SQM INSERT-SELECT" ); throw new SemanticException( "Not expecting multiple table references for an SQM INSERT-SELECT" );
} }
List<SqmValues> valuesList = sqmStatement.getValuesList(); for ( SqmValues sqmValues : sqmStatement.getValuesList() ) {
for ( SqmValues sqmValues : valuesList ) {
final Values values = visitValues( sqmValues ); final Values values = visitValues( sqmValues );
additionalInsertValues.applyValues( values ); additionalInsertValues.applyValues( values );
insertStatement.getValuesList().add( values ); insertStatement.getValuesList().add( values );
@ -1249,9 +1250,10 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
return true; return true;
} }
} }
final String fragment = ( (BulkInsertionCapableIdentifierGenerator) identifierGenerator ).determineBulkInsertionIdentifierGenerationSelectFragment( final String fragment = ( (BulkInsertionCapableIdentifierGenerator) identifierGenerator )
sessionFactory.getSqlStringGenerationContext() .determineBulkInsertionIdentifierGenerationSelectFragment(
); sessionFactory.getSqlStringGenerationContext()
);
// The position is irrelevant as this is only needed for insert // The position is irrelevant as this is only needed for insert
identifierSelection = new SqlSelectionImpl( identifierSelection = new SqlSelectionImpl(
1, 1,
@ -1392,15 +1394,13 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
forEachCteColumn( forEachCteColumn(
cteTable, cteTable,
specification.getCteColumn(), specification.getCteColumn(),
cteColumn -> { cteColumn -> searchClauseSpecifications.add(
searchClauseSpecifications.add( new SearchClauseSpecification(
new SearchClauseSpecification( cteColumn,
cteColumn, specification.getSortOrder(),
specification.getSortOrder(), specification.getNullPrecedence()
specification.getNullPrecedence() )
) )
);
}
); );
} }
@ -1473,14 +1473,12 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
if ( valueMapping instanceof EmbeddableValuedModelPart ) { if ( valueMapping instanceof EmbeddableValuedModelPart ) {
valueMapping.forEachJdbcType( valueMapping.forEachJdbcType(
(index, jdbcMapping) -> { (index, jdbcMapping) -> sqlCteColumns.add(
sqlCteColumns.add( new CteColumn(
new CteColumn( sqmCteTableColumn.getColumnName() + "_" + index,
sqmCteTableColumn.getColumnName() + "_" + index, jdbcMapping
jdbcMapping )
) )
);
}
); );
} }
else { else {
@ -1715,13 +1713,13 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
final TableGroup root = roots.get( 0 ); final TableGroup root = roots.get( 0 );
if ( CollectionHelper.isNotEmpty( collectionFilterPredicates ) ) { if ( CollectionHelper.isNotEmpty( collectionFilterPredicates ) ) {
root.getTableGroupJoins().forEach( (tableGroupJoin) -> { root.getTableGroupJoins().forEach( (tableGroupJoin) ->
collectionFilterPredicates.forEach( (alias, predicates) -> { collectionFilterPredicates.forEach( (alias, predicates) -> {
if ( tableGroupJoin.getJoinedGroup().getGroupAlias().equals( alias ) ) { if ( tableGroupJoin.getJoinedGroup().getGroupAlias().equals( alias ) ) {
tableGroupJoin.applyPredicate( predicates.getPredicate() ); tableGroupJoin.applyPredicate( predicates.getPredicate() );
} }
} ); } )
} ); );
} }
} }
} }
@ -2036,13 +2034,13 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
); );
} }
public QuerySpec visitOffsetAndFetchExpressions(QuerySpec sqlQuerySpec, SqmQuerySpec<?> sqmQuerySpec) { // public QuerySpec visitOffsetAndFetchExpressions(QuerySpec sqlQuerySpec, SqmQuerySpec<?> sqmQuerySpec) {
final Expression offsetExpression = visitOffsetExpression( sqmQuerySpec.getOffsetExpression() ); // final Expression offsetExpression = visitOffsetExpression( sqmQuerySpec.getOffsetExpression() );
final Expression fetchExpression = visitFetchExpression( sqmQuerySpec.getFetchExpression() ); // final Expression fetchExpression = visitFetchExpression( sqmQuerySpec.getFetchExpression() );
sqlQuerySpec.setOffsetClauseExpression( offsetExpression ); // sqlQuerySpec.setOffsetClauseExpression( offsetExpression );
sqlQuerySpec.setFetchClauseExpression( fetchExpression, sqmQuerySpec.getFetchClauseType() ); // sqlQuerySpec.setFetchClauseExpression( fetchExpression, sqmQuerySpec.getFetchClauseType() );
return sqlQuerySpec; // return sqlQuerySpec;
} // }
@Override @Override
public Expression visitOffsetExpression(SqmExpression<?> expression) { public Expression visitOffsetExpression(SqmExpression<?> expression) {
@ -2958,7 +2956,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
@Override @Override
public Expression visitQualifiedEntityJoin(SqmEntityJoin sqmJoin) { public Expression visitQualifiedEntityJoin(SqmEntityJoin<?> sqmJoin) {
// todo (6.0) : have this resolve to TableGroup instead? // todo (6.0) : have this resolve to TableGroup instead?
// - trying to remove tracking of TableGroupJoin in the x-refs // - trying to remove tracking of TableGroupJoin in the x-refs
@ -3028,7 +3026,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
EntityMappingType mappingType; EntityMappingType mappingType;
if ( path instanceof SqmTreatedPath ) { if ( path instanceof SqmTreatedPath ) {
mappingType = creationContext.getDomainModel() mappingType = creationContext.getDomainModel()
.findEntityDescriptor( ( (SqmTreatedPath) path ).getTreatTarget().getHibernateEntityName() ); .findEntityDescriptor( ( (SqmTreatedPath<?,?>) path ).getTreatTarget().getHibernateEntityName() );
} }
else { else {
mappingType = mapping.getEntityMappingType(); mappingType = mapping.getEntityMappingType();
@ -3371,7 +3369,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
.getBasicTypeForJavaType( Integer.class ); .getBasicTypeForJavaType( Integer.class );
final Expression expression = new SelfRenderingAggregateFunctionSqlAstExpression( final Expression expression = new SelfRenderingAggregateFunctionSqlAstExpression(
functionDescriptor.getName(), functionDescriptor.getName(),
functionDescriptor::render, functionDescriptor,
Collections.singletonList( new QueryLiteral<>( 1, integerType ) ), Collections.singletonList( new QueryLiteral<>( 1, integerType ) ),
null, null,
integerType, integerType,
@ -3537,35 +3535,34 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
tupleElements = new ArrayList<>( jdbcTypeCount ); tupleElements = new ArrayList<>( jdbcTypeCount );
} }
modelPart.forEachSelectable( modelPart.forEachSelectable(
(selectionIndex, selectionMapping) -> { (selectionIndex, selectionMapping) -> tupleElements.add(
tupleElements.add( new ColumnReference(
new ColumnReference( tableGroup.resolveTableReference(
tableGroup.resolveTableReference( navigablePath,
navigablePath, selectionMapping.getContainingTableExpression()
selectionMapping.getContainingTableExpression() ),
), selectionMapping,
selectionMapping, creationContext.getSessionFactory()
creationContext.getSessionFactory() )
) )
);
}
); );
if ( jdbcTypeCount != 1 ) { if ( jdbcTypeCount != 1 ) {
arguments.add( new SqlTuple( tupleElements, modelPart ) ); arguments.add( new SqlTuple( tupleElements, modelPart ) );
} }
final Expression expression = new SelfRenderingAggregateFunctionSqlAstExpression( final Expression expression = new SelfRenderingAggregateFunctionSqlAstExpression(
functionDescriptor.getName(), functionDescriptor.getName(),
functionDescriptor::render, functionDescriptor,
(List<SqlAstNode>) (List<?>) arguments, arguments,
null, null,
(AllowableFunctionReturnType<?>) modelPart.getJdbcMappings().get( 0 ), (AllowableFunctionReturnType<?>) modelPart.getJdbcMappings().get( 0 ),
modelPart modelPart
); );
subQuerySpec.getSelectClause().addSqlSelection( new SqlSelectionImpl( 1, 0, expression ) ); subQuerySpec.getSelectClause().addSqlSelection( new SqlSelectionImpl( 1, 0, expression ) );
NavigablePath parent = pluralPartPath.getPluralDomainPath().getNavigablePath().getParent();
subQuerySpec.applyPredicate( subQuerySpec.applyPredicate(
pluralAttributeMapping.getKeyDescriptor().generateJoinPredicate( pluralAttributeMapping.getKeyDescriptor().generateJoinPredicate(
parentFromClauseAccess.findTableGroup( pluralPartPath.getPluralDomainPath().getNavigablePath().getParent() ), parentFromClauseAccess.findTableGroup( parent ),
tableGroup, tableGroup,
SqlAstJoinType.INNER, SqlAstJoinType.INNER,
getSqlExpressionResolver(), getSqlExpressionResolver(),
@ -3776,19 +3773,17 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
else { else {
final List<ColumnReference> resultColumnReferences = new ArrayList<>( jdbcTypeCount ); final List<ColumnReference> resultColumnReferences = new ArrayList<>( jdbcTypeCount );
modelPart.forEachSelectable( modelPart.forEachSelectable(
(selectionIndex, selectionMapping) -> { (selectionIndex, selectionMapping) -> resultColumnReferences.add(
resultColumnReferences.add( new ColumnReference(
new ColumnReference( identifierVariable,
identifierVariable, tableReference.getColumnNames().get( selectionIndex ),
tableReference.getColumnNames().get( selectionIndex ), false,
false, null,
null, null,
null, selectionMapping.getJdbcMapping(),
selectionMapping.getJdbcMapping(), creationContext.getSessionFactory()
creationContext.getSessionFactory() )
) )
);
}
); );
return new SqlTuple( resultColumnReferences, modelPart ); return new SqlTuple( resultColumnReferences, modelPart );
} }
@ -3851,7 +3846,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
@Override @Override
public Expression visitLiteral(SqmLiteral<?> literal) { public Expression visitLiteral(SqmLiteral<?> literal) {
final Supplier<MappingModelExpressable> inferableTypeAccess = inferrableTypeAccessStack.getCurrent(); final Supplier<MappingModelExpressable<?>> inferableTypeAccess = inferrableTypeAccessStack.getCurrent();
if ( literal instanceof SqmLiteralNull ) { if ( literal instanceof SqmLiteralNull ) {
MappingModelExpressable<?> mappingModelExpressable = inferableTypeAccess.get(); MappingModelExpressable<?> mappingModelExpressable = inferableTypeAccess.get();
@ -3884,7 +3879,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
if ( inferableExpressable instanceof ConvertibleModelPart ) { if ( inferableExpressable instanceof ConvertibleModelPart ) {
final ConvertibleModelPart convertibleModelPart = (ConvertibleModelPart) inferableExpressable; final ConvertibleModelPart convertibleModelPart = (ConvertibleModelPart) inferableExpressable;
final BasicValueConverter<Object, Object> valueConverter = convertibleModelPart.getValueConverter(); final BasicValueConverter valueConverter = convertibleModelPart.getValueConverter();
if ( valueConverter != null ) { if ( valueConverter != null ) {
final Object literalValue = literal.getLiteralValue(); final Object literalValue = literal.getLiteralValue();
@ -3980,9 +3975,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
embeddableValuedModelPart.forEachJdbcValue( embeddableValuedModelPart.forEachJdbcValue(
literal.getLiteralValue(), literal.getLiteralValue(),
null, null,
(selectionIndex, value, jdbcMapping) -> { (selectionIndex, value, jdbcMapping)
list.add( new QueryLiteral<>( value, (BasicValuedMapping) jdbcMapping ) ); -> list.add( new QueryLiteral<>( value, (BasicValuedMapping) jdbcMapping ) ),
},
null null
); );
return new SqlTuple( list, expressable ); return new SqlTuple( list, expressable );
@ -4021,9 +4015,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
associationKeyPart.forEachJdbcValue( associationKeyPart.forEachJdbcValue(
associationKey, associationKey,
null, null,
(selectionIndex, value, jdbcMapping) -> { (selectionIndex, value, jdbcMapping)
list.add( new QueryLiteral<>( value, (BasicValuedMapping) jdbcMapping ) ); -> list.add( new QueryLiteral<>( value, (BasicValuedMapping) jdbcMapping ) ),
},
null null
); );
return new SqlTuple( list, associationKeyPart ); return new SqlTuple( list, associationKeyPart );
@ -4054,11 +4047,11 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
} }
private final Map<SqmParameter, List<List<JdbcParameter>>> jdbcParamsBySqmParam = new IdentityHashMap<>(); private final Map<SqmParameter<?>, List<List<JdbcParameter>>> jdbcParamsBySqmParam = new IdentityHashMap<>();
private final JdbcParameters jdbcParameters = new JdbcParametersImpl(); private final JdbcParameters jdbcParameters = new JdbcParametersImpl();
@Override @Override
public Map<SqmParameter, List<List<JdbcParameter>>> getJdbcParamsBySqmParam() { public Map<SqmParameter<?>, List<List<JdbcParameter>>> getJdbcParamsBySqmParam() {
return jdbcParamsBySqmParam; return jdbcParamsBySqmParam;
} }
@ -4068,9 +4061,9 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
protected Expression consumeSqmParameter( protected Expression consumeSqmParameter(
SqmParameter sqmParameter, SqmParameter<?> sqmParameter,
BiConsumer<Integer,JdbcParameter> jdbcParameterConsumer) { BiConsumer<Integer,JdbcParameter> jdbcParameterConsumer) {
final MappingModelExpressable valueMapping = determineValueMapping( sqmParameter ); final MappingModelExpressable<?> valueMapping = determineValueMapping( sqmParameter );
final List<JdbcParameter> jdbcParametersForSqm = new ArrayList<>(); final List<JdbcParameter> jdbcParametersForSqm = new ArrayList<>();
@ -4089,7 +4082,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
.add( jdbcParametersForSqm ); .add( jdbcParametersForSqm );
final QueryParameterImplementor<?> queryParameter = domainParameterXref.getQueryParameter( sqmParameter ); final QueryParameterImplementor<?> queryParameter = domainParameterXref.getQueryParameter( sqmParameter );
final QueryParameterBinding<?> binding = domainParameterBindings.getBinding( queryParameter ); final QueryParameterBinding binding = domainParameterBindings.getBinding( queryParameter );
if ( binding.setType( valueMapping ) ) { if ( binding.setType( valueMapping ) ) {
replaceJdbcParametersType( replaceJdbcParametersType(
sqmParameter, sqmParameter,
@ -4107,8 +4100,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
private void replaceJdbcParametersType( private void replaceJdbcParametersType(
SqmParameter sourceSqmParameter, SqmParameter<?> sourceSqmParameter,
List<SqmParameter> sqmParameters, List<SqmParameter<?>> sqmParameters,
MappingModelExpressable<?> valueMapping) { MappingModelExpressable<?> valueMapping) {
final JdbcMapping jdbcMapping = valueMapping.getJdbcMappings().get( 0 ); final JdbcMapping jdbcMapping = valueMapping.getJdbcMappings().get( 0 );
for ( SqmParameter<?> sqmParameter : sqmParameters ) { for ( SqmParameter<?> sqmParameter : sqmParameters ) {
@ -4132,20 +4125,20 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
} }
protected Expression consumeSqmParameter(SqmParameter sqmParameter) { protected Expression consumeSqmParameter(SqmParameter<?> sqmParameter) {
if ( sqmParameter.allowMultiValuedBinding() ) { if ( sqmParameter.allowMultiValuedBinding() ) {
final QueryParameterImplementor<?> domainParam = domainParameterXref.getQueryParameter( sqmParameter ); final QueryParameterImplementor<?> domainParam = domainParameterXref.getQueryParameter( sqmParameter );
final QueryParameterBinding domainParamBinding = domainParameterBindings.getBinding( domainParam ); final QueryParameterBinding<?> domainParamBinding = domainParameterBindings.getBinding( domainParam );
if ( !domainParamBinding.isMultiValued() ) { if ( !domainParamBinding.isMultiValued() ) {
return consumeSingleSqmParameter( sqmParameter ); return consumeSingleSqmParameter( sqmParameter );
} }
final Collection bindValues = domainParamBinding.getBindValues(); final Collection<?> bindValues = domainParamBinding.getBindValues();
final List<Expression> expressions = new ArrayList<>( bindValues.size()); final List<Expression> expressions = new ArrayList<>( bindValues.size());
boolean first = true; boolean first = true;
for ( Object bindValue : bindValues ) { for ( Object bindValue : bindValues ) {
final SqmParameter sqmParamToConsume; final SqmParameter<?> sqmParamToConsume;
// for each bind value create an "expansion" // for each bind value create an "expansion"
if ( first ) { if ( first ) {
sqmParamToConsume = sqmParameter; sqmParamToConsume = sqmParameter;
@ -4165,8 +4158,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
} }
protected Expression consumeSingleSqmParameter(SqmParameter sqmParameter) { protected Expression consumeSingleSqmParameter(SqmParameter<?> sqmParameter) {
final MappingModelExpressable valueMapping = determineValueMapping( sqmParameter ); final MappingModelExpressable<?> valueMapping = determineValueMapping( sqmParameter );
final List<JdbcParameter> jdbcParametersForSqm = new ArrayList<>(); final List<JdbcParameter> jdbcParametersForSqm = new ArrayList<>();
@ -4182,7 +4175,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
.add( jdbcParametersForSqm ); .add( jdbcParametersForSqm );
final QueryParameterImplementor<?> queryParameter = domainParameterXref.getQueryParameter( sqmParameter ); final QueryParameterImplementor<?> queryParameter = domainParameterXref.getQueryParameter( sqmParameter );
final QueryParameterBinding<?> binding = domainParameterBindings.getBinding( queryParameter ); final QueryParameterBinding binding = domainParameterBindings.getBinding( queryParameter );
if ( binding.setType( valueMapping ) ) { if ( binding.setType( valueMapping ) ) {
replaceJdbcParametersType( replaceJdbcParametersType(
sqmParameter, sqmParameter,
@ -4199,33 +4192,33 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
); );
} }
protected MappingModelExpressable<?> lenientlyResolveMappingExpressable(SqmExpressable<?> nodeType) { // protected MappingModelExpressable<?> lenientlyResolveMappingExpressable(SqmExpressable<?> nodeType) {
return resolveMappingExpressable( nodeType ); // return resolveMappingExpressable( nodeType );
} // }
//
protected MappingModelExpressable<?> resolveMappingExpressable(SqmExpressable<?> nodeType) { // protected MappingModelExpressable<?> resolveMappingExpressable(SqmExpressable<?> nodeType) {
final MappingModelExpressable valueMapping = getCreationContext().getDomainModel().resolveMappingExpressable( // final MappingModelExpressable<?> valueMapping = getCreationContext().getDomainModel().resolveMappingExpressable(
nodeType, // nodeType,
this::findTableGroupByPath // this::findTableGroupByPath
); // );
//
if ( valueMapping == null ) { // if ( valueMapping == null ) {
final Supplier<MappingModelExpressable> currentExpressableSupplier = inferrableTypeAccessStack.getCurrent(); // final Supplier<MappingModelExpressable<?>> currentExpressableSupplier = inferrableTypeAccessStack.getCurrent();
if ( currentExpressableSupplier != null ) { // if ( currentExpressableSupplier != null ) {
return currentExpressableSupplier.get(); // return currentExpressableSupplier.get();
} // }
} // }
//
if ( valueMapping == null ) { // if ( valueMapping == null ) {
throw new ConversionException( "Could not determine ValueMapping for SqmExpressable: " + nodeType ); // throw new ConversionException( "Could not determine ValueMapping for SqmExpressable: " + nodeType );
} // }
//
return valueMapping; // return valueMapping;
} // }
protected MappingModelExpressable<?> determineValueMapping(SqmExpression<?> sqmExpression) { protected MappingModelExpressable<?> determineValueMapping(SqmExpression<?> sqmExpression) {
if ( sqmExpression instanceof SqmParameter ) { if ( sqmExpression instanceof SqmParameter ) {
return determineValueMapping( (SqmParameter) sqmExpression ); return determineValueMapping( (SqmParameter<?>) sqmExpression );
} }
final MappingMetamodel domainModel = getCreationContext().getDomainModel(); final MappingMetamodel domainModel = getCreationContext().getDomainModel();
@ -4241,7 +4234,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
// The model type of an enum literal is always inferred // The model type of an enum literal is always inferred
if ( sqmExpression instanceof SqmEnumLiteral<?> ) { if ( sqmExpression instanceof SqmEnumLiteral<?> ) {
final Supplier<MappingModelExpressable> currentExpressableSupplier = inferrableTypeAccessStack.getCurrent(); final Supplier<MappingModelExpressable<?>> currentExpressableSupplier = inferrableTypeAccessStack.getCurrent();
if ( currentExpressableSupplier != null ) { if ( currentExpressableSupplier != null ) {
return currentExpressableSupplier.get(); return currentExpressableSupplier.get();
} }
@ -4304,13 +4297,13 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
// We can't determine the type of the expression // We can't determine the type of the expression
return null; return null;
} }
final MappingModelExpressable valueMapping = domainModel.resolveMappingExpressable( final MappingModelExpressable<?> valueMapping = domainModel.resolveMappingExpressable(
nodeType, nodeType,
this::findTableGroupByPath this::findTableGroupByPath
); );
if ( valueMapping == null ) { if ( valueMapping == null ) {
final Supplier<MappingModelExpressable> currentExpressableSupplier = inferrableTypeAccessStack.getCurrent(); final Supplier<MappingModelExpressable<?>> currentExpressableSupplier = inferrableTypeAccessStack.getCurrent();
if ( currentExpressableSupplier != null ) { if ( currentExpressableSupplier != null ) {
return currentExpressableSupplier.get(); return currentExpressableSupplier.get();
} }
@ -4324,9 +4317,9 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
protected MappingModelExpressable<?> getInferredValueMapping() { protected MappingModelExpressable<?> getInferredValueMapping() {
final Supplier<MappingModelExpressable> currentExpressableSupplier = inferrableTypeAccessStack.getCurrent(); final Supplier<MappingModelExpressable<?>> currentExpressableSupplier = inferrableTypeAccessStack.getCurrent();
if ( currentExpressableSupplier != null ) { if ( currentExpressableSupplier != null ) {
final MappingModelExpressable inferredMapping = currentExpressableSupplier.get(); final MappingModelExpressable<?> inferredMapping = currentExpressableSupplier.get();
if ( inferredMapping != null ) { if ( inferredMapping != null ) {
if ( inferredMapping instanceof PluralAttributeMapping ) { if ( inferredMapping instanceof PluralAttributeMapping ) {
return ( (PluralAttributeMapping) inferredMapping ).getElementDescriptor(); return ( (PluralAttributeMapping) inferredMapping ).getElementDescriptor();
@ -4374,7 +4367,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
if ( parameterSqmType instanceof SqmPath ) { if ( parameterSqmType instanceof SqmPath ) {
final SqmPath sqmPath = (SqmPath) parameterSqmType; final SqmPath<?> sqmPath = (SqmPath<?>) parameterSqmType;
final NavigablePath navigablePath = sqmPath.getNavigablePath(); final NavigablePath navigablePath = sqmPath.getNavigablePath();
if ( navigablePath.getParent() != null ) { if ( navigablePath.getParent() != null ) {
final TableGroup tableGroup = getFromClauseAccess().getTableGroup( navigablePath.getParent() ); final TableGroup tableGroup = getFromClauseAccess().getTableGroup( navigablePath.getParent() );
@ -4415,13 +4408,13 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
throw new ConversionException( "Could not determine ValueMapping for SqmParameter: " + sqmParameter ); throw new ConversionException( "Could not determine ValueMapping for SqmParameter: " + sqmParameter );
} }
protected final Stack<Supplier<MappingModelExpressable>> inferrableTypeAccessStack = new StandardStack<>( protected final Stack<Supplier<MappingModelExpressable<?>>> inferrableTypeAccessStack = new StandardStack<>(
() -> null () -> null
); );
private void resolveSqmParameter( private void resolveSqmParameter(
SqmParameter expression, SqmParameter<?> expression,
MappingModelExpressable valueMapping, MappingModelExpressable<?> valueMapping,
BiConsumer<Integer,JdbcParameter> jdbcParameterConsumer) { BiConsumer<Integer,JdbcParameter> jdbcParameterConsumer) {
sqmParameterMappingModelTypes.put( expression, valueMapping ); sqmParameterMappingModelTypes.put( expression, valueMapping );
final Bindable bindable; final Bindable bindable;
@ -4608,8 +4601,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
@Override @Override
public Object visitBinaryArithmeticExpression(SqmBinaryArithmetic<?> expression) { public Object visitBinaryArithmeticExpression(SqmBinaryArithmetic<?> expression) {
SqmExpression leftOperand = expression.getLeftHandOperand(); SqmExpression<?> leftOperand = expression.getLeftHandOperand();
SqmExpression rightOperand = expression.getRightHandOperand(); SqmExpression<?> rightOperand = expression.getRightHandOperand();
boolean durationToRight = TypeConfiguration.isDuration( rightOperand.getNodeType() ); boolean durationToRight = TypeConfiguration.isDuration( rightOperand.getNodeType() );
TypeConfiguration typeConfiguration = getCreationContext().getDomainModel().getTypeConfiguration(); TypeConfiguration typeConfiguration = getCreationContext().getDomainModel().getTypeConfiguration();
@ -4707,10 +4700,10 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
adjustedTimestamp = toSqlExpression( expression.getLeftHandOperand().accept( this ) ); adjustedTimestamp = toSqlExpression( expression.getLeftHandOperand().accept( this ) );
JdbcMappingContainer type = adjustedTimestamp.getExpressionType(); JdbcMappingContainer type = adjustedTimestamp.getExpressionType();
if ( type instanceof SqmExpressable ) { if ( type instanceof SqmExpressable ) {
adjustedTimestampType = (SqmExpressable) type; adjustedTimestampType = (SqmExpressable<?>) type;
} }
else if (type instanceof AttributeMapping ) { else if (type instanceof AttributeMapping ) {
adjustedTimestampType = (SqmExpressable) ( (AttributeMapping) type ).getMappedType(); adjustedTimestampType = (SqmExpressable<?>) ( (AttributeMapping) type ).getMappedType();
} }
else { else {
// else we know it has not been transformed // else we know it has not been transformed
@ -4758,7 +4751,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
} }
private Object transformDatetimeArithmetic(SqmBinaryArithmetic expression) { private Object transformDatetimeArithmetic(SqmBinaryArithmetic<?> expression) {
BinaryArithmeticOperator operator = expression.getOperator(); BinaryArithmeticOperator operator = expression.getOperator();
// the only kind of algebra we know how to // the only kind of algebra we know how to
@ -5055,7 +5048,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
@Override @Override
public CaseSimpleExpression visitSimpleCaseExpression(SqmCaseSimple<?, ?> expression) { public CaseSimpleExpression visitSimpleCaseExpression(SqmCaseSimple<?, ?> expression) {
final List<CaseSimpleExpression.WhenFragment> whenFragments = new ArrayList<>( expression.getWhenFragments().size() ); final List<CaseSimpleExpression.WhenFragment> whenFragments = new ArrayList<>( expression.getWhenFragments().size() );
final Supplier<MappingModelExpressable> inferenceSupplier = inferrableTypeAccessStack.getCurrent(); final Supplier<MappingModelExpressable<?>> inferenceSupplier = inferrableTypeAccessStack.getCurrent();
inferrableTypeAccessStack.push( inferrableTypeAccessStack.push(
() -> { () -> {
for ( SqmCaseSimple.WhenFragment<?, ?> whenFragment : expression.getWhenFragments() ) { for ( SqmCaseSimple.WhenFragment<?, ?> whenFragment : expression.getWhenFragments() ) {
@ -5113,7 +5106,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
@Override @Override
public CaseSearchedExpression visitSearchedCaseExpression(SqmCaseSearched<?> expression) { public CaseSearchedExpression visitSearchedCaseExpression(SqmCaseSearched<?> expression) {
final List<CaseSearchedExpression.WhenFragment> whenFragments = new ArrayList<>( expression.getWhenFragments().size() ); final List<CaseSearchedExpression.WhenFragment> whenFragments = new ArrayList<>( expression.getWhenFragments().size() );
final Supplier<MappingModelExpressable> inferenceSupplier = inferrableTypeAccessStack.getCurrent(); final Supplier<MappingModelExpressable<?>> inferenceSupplier = inferrableTypeAccessStack.getCurrent();
MappingModelExpressable<?> resolved = determineCurrentExpressable( expression ); MappingModelExpressable<?> resolved = determineCurrentExpressable( expression );
Expression otherwise = null; Expression otherwise = null;
@ -5161,39 +5154,35 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
} }
private <X> X visitWithLenientInferredType(SqmExpression<?> expression, SqmExpression<?> inferred) { // private <X> X visitWithLenientInferredType(SqmExpression<?> expression, SqmExpression<?> inferred) {
inferrableTypeAccessStack.push( // inferrableTypeAccessStack.push(
() -> { // () -> {
MappingModelExpressable<?> definedType = creationContext // MappingModelExpressable<?> definedType = creationContext
.getDomainModel() // .getDomainModel()
.resolveMappingExpressable( // .resolveMappingExpressable(
expression.getNodeType(), // expression.getNodeType(),
getFromClauseIndex()::findTableGroup // getFromClauseIndex()::findTableGroup
); // );
if ( definedType != null ) { // if ( definedType != null ) {
return definedType; // return definedType;
} // }
definedType = creationContext // definedType = creationContext
.getDomainModel() // .getDomainModel()
.lenientlyResolveMappingExpressable( // .lenientlyResolveMappingExpressable(
inferred.getNodeType(), // inferred.getNodeType(),
getFromClauseIndex()::findTableGroup // getFromClauseIndex()::findTableGroup
); // );
if ( definedType != null ) { // return definedType;
return definedType; // }
} // );
//
return null; // try {
} // return (X) expression.accept( this );
); // }
// finally {
try { // inferrableTypeAccessStack.pop();
return (X) expression.accept( this ); // }
} // }
finally {
inferrableTypeAccessStack.pop();
}
}
@Override @Override
public Object visitAny(SqmAny<?> sqmAny) { public Object visitAny(SqmAny<?> sqmAny) {
@ -5255,7 +5244,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
final BasicValuedMapping inferrableType = (BasicValuedMapping) inferrableTypeAccessStack.getCurrent().get(); final BasicValuedMapping inferrableType = (BasicValuedMapping) inferrableTypeAccessStack.getCurrent().get();
if ( inferrableType instanceof ConvertibleModelPart ) { if ( inferrableType instanceof ConvertibleModelPart ) {
final ConvertibleModelPart inferredPart = (ConvertibleModelPart) inferrableType; final ConvertibleModelPart inferredPart = (ConvertibleModelPart) inferrableType;
final BasicValueConverter valueConverter = inferredPart.getValueConverter(); @SuppressWarnings("unchecked")
final BasicValueConverter<Enum<?>,?> valueConverter = inferredPart.getValueConverter();
final Object jdbcValue = valueConverter.toRelationalValue( sqmEnumLiteral.getEnumValue() ); final Object jdbcValue = valueConverter.toRelationalValue( sqmEnumLiteral.getEnumValue() );
return new QueryLiteral<>( jdbcValue, inferredPart ); return new QueryLiteral<>( jdbcValue, inferredPart );
} }
@ -5312,8 +5302,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
() -> ( (EntityCollectionPart) pluralAttributeMapping.getElementDescriptor() ).getKeyTargetMatchPart() ); () -> ( (EntityCollectionPart) pluralAttributeMapping.getElementDescriptor() ).getKeyTargetMatchPart() );
} }
else if ( pluralAttributeMapping.getElementDescriptor() instanceof EmbeddedCollectionPart ) { else if ( pluralAttributeMapping.getElementDescriptor() instanceof EmbeddedCollectionPart ) {
inferrableTypeAccessStack.push( inferrableTypeAccessStack.push(pluralAttributeMapping::getElementDescriptor);
() -> pluralAttributeMapping.getElementDescriptor() );
} }
else { else {
inferrableTypeAccessStack.push( () -> pluralAttributeMapping ); inferrableTypeAccessStack.push( () -> pluralAttributeMapping );
@ -5722,7 +5711,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
@Override @Override
public InSubQueryPredicate visitInSubQueryPredicate(SqmInSubQueryPredicate predicate) { public InSubQueryPredicate visitInSubQueryPredicate(SqmInSubQueryPredicate<?> predicate) {
return new InSubQueryPredicate( return new InSubQueryPredicate(
visitWithInferredType( predicate.getTestExpression(), predicate.getSubQueryExpression() ), visitWithInferredType( predicate.getTestExpression(), predicate.getSubQueryExpression() ),
visitWithInferredType( predicate.getSubQueryExpression(), predicate.getTestExpression() ), visitWithInferredType( predicate.getSubQueryExpression(), predicate.getTestExpression() ),
@ -5865,16 +5854,16 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
} }
final TableGroup existingJoinedGroup = fromClauseIndex.findTableGroup( fetchablePath ); // final TableGroup existingJoinedGroup = fromClauseIndex.findTableGroup( fetchablePath );
if ( existingJoinedGroup != null ) { // if ( existingJoinedGroup != null ) {
// we can use this to trigger the fetch from the joined group. // we can use this to trigger the fetch from the joined group.
// todo (6.0) : do we want to do this though? // todo (6.0) : do we want to do this though?
// On the positive side it would allow EntityGraph to use the existing TableGroup. But that ties in // On the positive side it would allow EntityGraph to use the existing TableGroup. But that ties in
// to the discussion above regarding how to handle eager and EntityGraph (JOIN versus SELECT). // to the discussion above regarding how to handle eager and EntityGraph (JOIN versus SELECT).
// Can be problematic if the existing one is restricted // Can be problematic if the existing one is restricted
//fetchTiming = FetchTiming.IMMEDIATE; // fetchTiming = FetchTiming.IMMEDIATE;
} // }
// lastly, account for any app-defined max-fetch-depth // lastly, account for any app-defined max-fetch-depth
final Integer maxDepth = getCreationContext().getMaximumFetchDepth(); final Integer maxDepth = getCreationContext().getMaximumFetchDepth();
@ -6147,10 +6136,6 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
return delegate.resolveSqlSelection( expression, javaTypeDescriptor, typeConfiguration ); return delegate.resolveSqlSelection( expression, javaTypeDescriptor, typeConfiguration );
} }
public SqmAliasedNodeCollector getSqmAliasedNodeCollector() {
return sqmAliasedNodeCollector;
}
public void setSqmAliasedNodeCollector(SqmAliasedNodeCollector sqmAliasedNodeCollector) { public void setSqmAliasedNodeCollector(SqmAliasedNodeCollector sqmAliasedNodeCollector) {
this.sqmAliasedNodeCollector = sqmAliasedNodeCollector; this.sqmAliasedNodeCollector = sqmAliasedNodeCollector;
} }
@ -6161,6 +6146,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
private final List<SqlSelection>[] sqlSelectionsForSqmSelection; private final List<SqlSelection>[] sqlSelectionsForSqmSelection;
private int index = -1; private int index = -1;
@SuppressWarnings("unchecked")
public SqmAliasedNodePositionTracker(SqlExpressionResolver delegate, List<? extends SqmAliasedNode<?>> selections) { public SqmAliasedNodePositionTracker(SqlExpressionResolver delegate, List<? extends SqmAliasedNode<?>> selections) {
this.delegate = delegate; this.delegate = delegate;
this.sqlSelectionsForSqmSelection = new List[countIndividualSelections( selections )]; this.sqlSelectionsForSqmSelection = new List[countIndividualSelections( selections )];
@ -6211,20 +6197,18 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
} }
@Override @Override
public List<Expression> expandSelfRenderingFunctionMultiValueParameter(SqmParameter sqmParameter) { public List<Expression> expandSelfRenderingFunctionMultiValueParameter(SqmParameter<?> sqmParameter) {
assert sqmParameter.allowMultiValuedBinding(); assert sqmParameter.allowMultiValuedBinding();
final QueryParameterImplementor<?> domainParam = domainParameterXref.getQueryParameter( final QueryParameterImplementor<?> domainParam = domainParameterXref.getQueryParameter( sqmParameter );
sqmParameter ); final QueryParameterBinding<?> domainParamBinding = domainParameterBindings.getBinding( domainParam );
final QueryParameterBinding domainParamBinding = domainParameterBindings.getBinding(
domainParam );
final Collection bindValues = domainParamBinding.getBindValues(); final Collection<?> bindValues = domainParamBinding.getBindValues();
final int bindValuesSize = bindValues.size(); final int bindValuesSize = bindValues.size();
final List<Expression> result = new ArrayList<>( bindValuesSize ); final List<Expression> result = new ArrayList<>( bindValuesSize );
boolean first = true; boolean first = true;
for ( int i = 0; i < bindValuesSize; i++ ) { for ( int i = 0; i < bindValuesSize; i++ ) {
final SqmParameter sqmParamToConsume; final SqmParameter<?> sqmParamToConsume;
// for each bind value create an "expansion" // for each bind value create an "expansion"
if ( first ) { if ( first ) {
sqmParamToConsume = sqmParameter; sqmParamToConsume = sqmParameter;

View File

@ -74,7 +74,7 @@ public class FakeSqmToSqlAstConverter extends BaseSemanticQueryWalker implements
} }
@Override @Override
public List<Expression> expandSelfRenderingFunctionMultiValueParameter(SqmParameter sqmParameter) { public List<Expression> expandSelfRenderingFunctionMultiValueParameter(SqmParameter<?> sqmParameter) {
return null; return null;
} }
} }

View File

@ -23,6 +23,6 @@ import org.hibernate.sql.ast.tree.expression.Expression;
public interface SqmToSqlAstConverter extends SemanticQueryWalker<Object>, SqlAstCreationState { public interface SqmToSqlAstConverter extends SemanticQueryWalker<Object>, SqlAstCreationState {
Stack<Clause> getCurrentClauseStack(); Stack<Clause> getCurrentClauseStack();
List<Expression> expandSelfRenderingFunctionMultiValueParameter(SqmParameter sqmParameter); List<Expression> expandSelfRenderingFunctionMultiValueParameter(SqmParameter<?> sqmParameter);
} }

View File

@ -8,10 +8,8 @@ package org.hibernate.query.sqm.sql;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Function;
import org.hibernate.metamodel.mapping.MappingModelExpressable; import org.hibernate.metamodel.mapping.MappingModelExpressable;
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.sql.ast.spi.FromClauseAccess; import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.spi.SqlExpressionResolver;
@ -27,6 +25,6 @@ public interface SqmTranslation<T extends Statement> {
T getSqlAst(); T getSqlAst();
SqlExpressionResolver getSqlExpressionResolver(); SqlExpressionResolver getSqlExpressionResolver();
FromClauseAccess getFromClauseAccess(); FromClauseAccess getFromClauseAccess();
Map<SqmParameter, List<List<JdbcParameter>>> getJdbcParamsBySqmParam(); Map<SqmParameter<?>, List<List<JdbcParameter>>> getJdbcParamsBySqmParam();
Map<SqmParameter,MappingModelExpressable> getSqmParameterMappingModelTypeResolutions(); Map<SqmParameter<?>, MappingModelExpressable<?>> getSqmParameterMappingModelTypeResolutions();
} }

View File

@ -22,15 +22,15 @@ import org.hibernate.sql.ast.tree.expression.JdbcParameter;
public class StandardSqmTranslation<T extends Statement> implements SqmTranslation<T> { public class StandardSqmTranslation<T extends Statement> implements SqmTranslation<T> {
private final T sqlAst; private final T sqlAst;
private final Map<SqmParameter, List<List<JdbcParameter>>> jdbcParamMap; private final Map<SqmParameter<?>, List<List<JdbcParameter>>> jdbcParamMap;
private final Map<SqmParameter, MappingModelExpressable> parameterMappingModelTypeMap; private final Map<SqmParameter<?>, MappingModelExpressable<?>> parameterMappingModelTypeMap;
private final SqlExpressionResolver sqlExpressionResolver; private final SqlExpressionResolver sqlExpressionResolver;
private final FromClauseAccess fromClauseAccess; private final FromClauseAccess fromClauseAccess;
public StandardSqmTranslation( public StandardSqmTranslation(
T sqlAst, T sqlAst,
Map<SqmParameter, List<List<JdbcParameter>>> jdbcParamMap, Map<SqmParameter<?>, List<List<JdbcParameter>>> jdbcParamMap,
Map<SqmParameter, MappingModelExpressable> parameterMappingModelTypeMap, Map<SqmParameter<?>, MappingModelExpressable<?>> parameterMappingModelTypeMap,
SqlExpressionResolver sqlExpressionResolver, SqlExpressionResolver sqlExpressionResolver,
FromClauseAccess fromClauseAccess) { FromClauseAccess fromClauseAccess) {
this.sqlAst = sqlAst; this.sqlAst = sqlAst;
@ -46,12 +46,12 @@ public class StandardSqmTranslation<T extends Statement> implements SqmTranslati
} }
@Override @Override
public Map<SqmParameter, List<List<JdbcParameter>>> getJdbcParamsBySqmParam() { public Map<SqmParameter<?>, List<List<JdbcParameter>>> getJdbcParamsBySqmParam() {
return jdbcParamMap; return jdbcParamMap;
} }
@Override @Override
public Map<SqmParameter, MappingModelExpressable> getSqmParameterMappingModelTypeResolutions() { public Map<SqmParameter<?>, MappingModelExpressable<?>> getSqmParameterMappingModelTypeResolutions() {
return parameterMappingModelTypeMap; return parameterMappingModelTypeMap;
} }

View File

@ -42,7 +42,7 @@ public interface FromClauseAccess {
/** /**
* Register a TableGroup under the given `navigablePath`. Logs a message * Register a TableGroup under the given `navigablePath`. Logs a message
* if thhis registration over-writes an existing one. * if this registration over-writes an existing one.
*/ */
void registerTableGroup(NavigablePath navigablePath, TableGroup tableGroup); void registerTableGroup(NavigablePath navigablePath, TableGroup tableGroup);

View File

@ -19,5 +19,5 @@ public interface FunctionExpression extends Expression {
String getFunctionName(); String getFunctionName();
List<SqlAstNode> getArguments(); List<? extends SqlAstNode> getArguments();
} }

View File

@ -59,9 +59,9 @@ public class SubqueryTest extends BaseSessionFactoryFunctionalTest {
@Override @Override
public void render( public void render(
SqlAppender sqlAppender, List<SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) { SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
sqlAstArguments.get( 0 ).accept( walker ); sqlAstArguments.get( 0 ).accept( walker );
sqlAppender.appendSql( " limit " + ( (QueryLiteral) sqlAstArguments.get( 1 ) ).getLiteralValue() ); sqlAppender.appendSql( " limit " + ( (QueryLiteral<?>) sqlAstArguments.get( 1 ) ).getLiteralValue() );
} }
} }