Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,11 @@ public SqmPath<J> createSqmPath(SqmPath<?> lhs, SqmPathSource<?> intermediatePat
return sqmPathSource.createSqmPath( lhs, intermediatePathSource );
}

@Override
public JavaType<?> getRelationalJavaType() {
return sqmPathSource.getRelationalJavaType();
}

private class DelayedKeyTypeAccess implements Supplier<SimpleDomainType<J>>, Serializable {
private boolean resolved;
private SimpleDomainType<J> type;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,6 @@ public interface JpaExpression<T> extends JpaSelection<T>, Expression<T> {

@Override
JpaPredicate in(Expression<Collection<?>> values);

<X> JpaExpression<X> cast(Class<X> type);
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import org.hibernate.query.sqm.tree.domain.SqmSetJoin;
import org.hibernate.query.sqm.tree.domain.SqmSingularJoin;
import org.hibernate.query.sqm.tree.domain.SqmTreatedPath;
import org.hibernate.query.sqm.tree.expression.AsWrapperSqmExpression;
import org.hibernate.query.sqm.tree.expression.JpaCriteriaParameter;
import org.hibernate.query.sqm.tree.expression.SqmAny;
import org.hibernate.query.sqm.tree.expression.SqmAnyDiscriminatorValue;
Expand Down Expand Up @@ -413,4 +414,5 @@ default T visitCorrelatedRoot(SqmCorrelatedRoot<?> correlatedRoot){

T visitFullyQualifiedClass(Class<?> namedClass);

T visitAsWrapperExpression(AsWrapperSqmExpression<?> expression);
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.hibernate.query.sqm.tree.domain.SqmPluralPartJoin;
import org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmTreatedPath;
import org.hibernate.query.sqm.tree.expression.AsWrapperSqmExpression;
import org.hibernate.query.sqm.tree.expression.JpaCriteriaParameter;
import org.hibernate.query.sqm.tree.expression.SqmAny;
import org.hibernate.query.sqm.tree.expression.SqmAnyDiscriminatorValue;
Expand Down Expand Up @@ -1133,6 +1134,11 @@ public Object visitFullyQualifiedClass(Class namedClass) {
return null;
}

@Override
public Object visitAsWrapperExpression(AsWrapperSqmExpression expression) {
return null;
}

@Override
public Object visitModifiedSubQueryExpression(SqmModifiedSubQueryExpression expression) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.hibernate.query.sqm.tree.domain.SqmPluralPartJoin;
import org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmTreatedPath;
import org.hibernate.query.sqm.tree.expression.AsWrapperSqmExpression;
import org.hibernate.query.sqm.tree.expression.JpaCriteriaParameter;
import org.hibernate.query.sqm.tree.expression.SqmAggregateFunction;
import org.hibernate.query.sqm.tree.expression.SqmAny;
Expand Down Expand Up @@ -940,4 +941,9 @@ public Object visitFieldLiteral(SqmFieldLiteral<?> sqmFieldLiteral) {
return sqmFieldLiteral;
}

@Override
public Object visitAsWrapperExpression(AsWrapperSqmExpression<?> expression) {
expression.getExpression().accept( this );
return expression;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@
import org.hibernate.query.sqm.produce.function.internal.PatternRenderer;
import org.hibernate.query.sqm.spi.BaseSemanticQueryWalker;
import org.hibernate.query.sqm.sql.internal.AnyDiscriminatorPathInterpretation;
import org.hibernate.query.sqm.sql.internal.AsWrappedExpression;
import org.hibernate.query.sqm.sql.internal.BasicValuedPathInterpretation;
import org.hibernate.query.sqm.sql.internal.DiscriminatedAssociationPathInterpretation;
import org.hibernate.query.sqm.sql.internal.DiscriminatorPathInterpretation;
Expand Down Expand Up @@ -192,6 +193,7 @@
import org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmTreatedPath;
import org.hibernate.query.sqm.tree.expression.AsWrapperSqmExpression;
import org.hibernate.query.sqm.tree.expression.Conversion;
import org.hibernate.query.sqm.tree.expression.JpaCriteriaParameter;
import org.hibernate.query.sqm.tree.expression.SqmAliasedNodeRef;
Expand Down Expand Up @@ -7836,6 +7838,14 @@ public Object visitFullyQualifiedClass(Class<?> namedClass) {
// .getOrMakeJavaDescriptor( namedClass );
}

@Override
public Object visitAsWrapperExpression(AsWrapperSqmExpression<?> sqmExpression) {
return new AsWrappedExpression<>(
(Expression) sqmExpression.getExpression().accept( this ),
sqmExpression.getNodeType()
);
}

@Override
public Fetch visitIdentifierFetch(EntityResultGraphNode fetchParent) {
final EntityIdentifierMapping identifierMapping = fetchParent.getReferencedMappingContainer()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
package org.hibernate.query.sqm.sql.internal;

import org.hibernate.metamodel.mapping.JdbcMappingContainer;
import org.hibernate.sql.ast.SqlAstWalker;
import org.hibernate.sql.ast.spi.SqlAstCreationState;
import org.hibernate.sql.ast.spi.SqlSelection;
import org.hibernate.sql.ast.tree.expression.ColumnReference;
import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.basic.BasicResult;
import org.hibernate.type.BasicType;
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.spi.TypeConfiguration;

public class AsWrappedExpression<B> implements Expression, DomainResultProducer<B> {
private final Expression wrappedExpression;
private final BasicType<B> expressionType;

public AsWrappedExpression(Expression wrappedExpression, BasicType<B> expressionType) {
assert wrappedExpression instanceof DomainResultProducer : "AsWrappedExpression expected to be an instance of DomainResultProducer";
this.wrappedExpression = wrappedExpression;
this.expressionType = expressionType;
}

@Override
public JdbcMappingContainer getExpressionType() {
return expressionType;
}

@Override
public ColumnReference getColumnReference() {
return wrappedExpression.getColumnReference();
}

@Override
public SqlSelection createSqlSelection(
int jdbcPosition,
int valuesArrayPosition,
JavaType javaType,
boolean virtual,
TypeConfiguration typeConfiguration) {
return wrappedExpression.createSqlSelection(
jdbcPosition,
valuesArrayPosition,
javaType,
virtual,
typeConfiguration
);
}

@Override
public SqlSelection createDomainResultSqlSelection(
int jdbcPosition,
int valuesArrayPosition,
JavaType javaType,
boolean virtual,
TypeConfiguration typeConfiguration) {
return wrappedExpression.createDomainResultSqlSelection(
jdbcPosition,
valuesArrayPosition,
javaType,
virtual,
typeConfiguration
);
}

@Override
public void accept(SqlAstWalker sqlTreeWalker) {
wrappedExpression.accept( sqlTreeWalker );
}

@Override
public DomainResult<B> createDomainResult(String resultVariable, DomainResultCreationState creationState) {
final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState();
final SqlSelection sqlSelection = sqlAstCreationState.getSqlExpressionResolver()
.resolveSqlSelection(
wrappedExpression,
wrappedExpression.getExpressionType().getSingleJdbcMapping().getJdbcJavaType(),
null,
sqlAstCreationState.getCreationContext()
.getMappingMetamodel().getTypeConfiguration()
);
return new BasicResult<>(
sqlSelection.getValuesArrayPosition(),
resultVariable,
expressionType.getExpressibleJavaType()
);
}

@Override
public void applySqlSelections(DomainResultCreationState creationState) {
//noinspection unchecked
( (DomainResultProducer<B>) wrappedExpression ).applySqlSelections( creationState );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -143,4 +143,9 @@ public DomainType<T> getSqmType() {
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitBasicValuedPath( this );
}

@Override
public JavaType<?> getRelationalJavaType() {
return super.getExpressible().getRelationalJavaType();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,9 @@ public Class<T> getJavaType() {
public Class<T> getBindableJavaType() {
return getJavaType();
}

@Override
public JavaType<?> getRelationalJavaType() {
return super.getExpressible().getRelationalJavaType();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.hibernate.query.sqm.tree.jpa.AbstractJpaSelection;
import org.hibernate.query.sqm.tree.predicate.SqmInPredicate;
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
import org.hibernate.type.BasicType;
import org.hibernate.type.descriptor.java.JavaType;

import jakarta.persistence.criteria.Expression;
Expand Down Expand Up @@ -102,7 +103,11 @@ public SqmExpression<String> asString() {

@Override
public <X> SqmExpression<X> as(Class<X> type) {
return nodeBuilder().cast(this, type);
final BasicType<X> basicTypeForJavaType = nodeBuilder().getTypeConfiguration().getBasicTypeForJavaType( type );
if ( basicTypeForJavaType == null ) {
throw new IllegalArgumentException( "Can't cast expression to unknown type: " + type.getCanonicalName() );
}
return new AsWrapperSqmExpression<>( basicTypeForJavaType, this );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.query.sqm.tree.expression;

import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.type.BasicType;

public class AsWrapperSqmExpression<T> extends AbstractSqmExpression<T> {
private final SqmExpression<?> expression;

AsWrapperSqmExpression(SqmExpressible<T> type, SqmExpression<?> expression) {
super( type, expression.nodeBuilder() );
this.expression = expression;
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitAsWrapperExpression( this );
}

@Override
public void appendHqlString(StringBuilder sb) {
sb.append( "wrap(" );
expression.appendHqlString( sb );
sb.append( " as " );
sb.append( getNodeType().getReturnedClass().getName() );
sb.append( ")" );
}

@Override
public <X> SqmExpression<X> as(Class<X> type) {
return expression.as( type );
}

@Override
public SqmExpression<T> copy(SqmCopyContext context) {
return new AsWrapperSqmExpression<>( getExpressible(), expression.copy( context ) );
}

public SqmExpression<?> getExpression() {
return expression;
}

@Override
public BasicType<T> getNodeType() {
return (BasicType<T>) super.getNodeType();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,9 @@ default <X> SqmExpression<X> castAs(DomainType<X> type) {
);
}

@Override
default <X> SqmExpression<X> cast(Class<X> type) {
return castAs( nodeBuilder().getTypeConfiguration().getBasicTypeForJavaType( type ) );
}

}

This file was deleted.

Loading