HHH-15390 Calling SqmQuery#getSqmStatement()#toHqlString() causes ClassCastExpection when using distinct in Criteria or HQL query
This commit is contained in:
parent
fac6b0c1f7
commit
35fb490aaa
|
@ -19,10 +19,8 @@ import org.hibernate.query.sqm.tree.SqmTypedNode;
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmAggregateFunction;
|
import org.hibernate.query.sqm.tree.expression.SqmAggregateFunction;
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmDistinct;
|
import org.hibernate.query.sqm.tree.expression.SqmDistinct;
|
||||||
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
||||||
import org.hibernate.query.sqm.tree.select.SqmSelectableNode;
|
|
||||||
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.predicate.Predicate;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Christian Beikov
|
* @author Christian Beikov
|
||||||
|
@ -107,14 +105,16 @@ public class SelfRenderingSqmAggregateFunction<T> extends SelfRenderingSqmFuncti
|
||||||
sb.append( '(' );
|
sb.append( '(' );
|
||||||
int i = 1;
|
int i = 1;
|
||||||
if ( arguments.get( 0 ) instanceof SqmDistinct<?> ) {
|
if ( arguments.get( 0 ) instanceof SqmDistinct<?> ) {
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( ' ' );
|
if ( arguments.size() > 1 ) {
|
||||||
( (SqmSelectableNode<?>) arguments.get( 1 ) ).appendHqlString( sb );
|
sb.append( ' ' );
|
||||||
i = 2;
|
arguments.get( 1 ).appendHqlString( sb );
|
||||||
|
i = 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for ( ; i < arguments.size(); i++ ) {
|
for ( ; i < arguments.size(); i++ ) {
|
||||||
sb.append(", ");
|
sb.append(", ");
|
||||||
( (SqmSelectableNode<?>) arguments.get( i ) ).appendHqlString( sb );
|
arguments.get( i ).appendHqlString( sb );
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
|
|
|
@ -21,12 +21,10 @@ import org.hibernate.query.sqm.tree.expression.SqmDistinct;
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmOrderedSetAggregateFunction;
|
import org.hibernate.query.sqm.tree.expression.SqmOrderedSetAggregateFunction;
|
||||||
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
||||||
import org.hibernate.query.sqm.tree.select.SqmOrderByClause;
|
import org.hibernate.query.sqm.tree.select.SqmOrderByClause;
|
||||||
import org.hibernate.query.sqm.tree.select.SqmSelectableNode;
|
|
||||||
import org.hibernate.query.sqm.tree.select.SqmSortSpecification;
|
import org.hibernate.query.sqm.tree.select.SqmSortSpecification;
|
||||||
import org.hibernate.sql.ast.Clause;
|
import org.hibernate.sql.ast.Clause;
|
||||||
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.predicate.Predicate;
|
|
||||||
import org.hibernate.sql.ast.tree.select.SortSpecification;
|
import org.hibernate.sql.ast.tree.select.SortSpecification;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -145,14 +143,16 @@ public class SelfRenderingSqmOrderedSetAggregateFunction<T> extends SelfRenderin
|
||||||
sb.append( '(' );
|
sb.append( '(' );
|
||||||
int i = 1;
|
int i = 1;
|
||||||
if ( arguments.get( 0 ) instanceof SqmDistinct<?> ) {
|
if ( arguments.get( 0 ) instanceof SqmDistinct<?> ) {
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( ' ' );
|
if ( arguments.size() > 1 ) {
|
||||||
( (SqmSelectableNode<?>) arguments.get( 1 ) ).appendHqlString( sb );
|
sb.append( ' ' );
|
||||||
i = 2;
|
arguments.get( 1 ).appendHqlString( sb );
|
||||||
|
i = 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for ( ; i < arguments.size(); i++ ) {
|
for ( ; i < arguments.size(); i++ ) {
|
||||||
sb.append(", ");
|
sb.append(", ");
|
||||||
( (SqmSelectableNode<?>) arguments.get( i ) ).appendHqlString( sb );
|
arguments.get( i ).appendHqlString( sb );
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
|
|
|
@ -19,10 +19,8 @@ import org.hibernate.query.sqm.tree.SqmTypedNode;
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmDistinct;
|
import org.hibernate.query.sqm.tree.expression.SqmDistinct;
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmWindowFunction;
|
import org.hibernate.query.sqm.tree.expression.SqmWindowFunction;
|
||||||
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
||||||
import org.hibernate.query.sqm.tree.select.SqmSelectableNode;
|
|
||||||
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.predicate.Predicate;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Christian Beikov
|
* @author Christian Beikov
|
||||||
|
@ -127,14 +125,16 @@ public class SelfRenderingSqmWindowFunction<T> extends SelfRenderingSqmFunction<
|
||||||
sb.append( '(' );
|
sb.append( '(' );
|
||||||
int i = 1;
|
int i = 1;
|
||||||
if ( arguments.get( 0 ) instanceof SqmDistinct<?> ) {
|
if ( arguments.get( 0 ) instanceof SqmDistinct<?> ) {
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( ' ' );
|
if ( arguments.size() > 1 ) {
|
||||||
( (SqmSelectableNode<?>) arguments.get( 1 ) ).appendHqlString( sb );
|
sb.append( ' ' );
|
||||||
i = 2;
|
arguments.get( 1 ).appendHqlString( sb );
|
||||||
|
i = 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for ( ; i < arguments.size(); i++ ) {
|
for ( ; i < arguments.size(); i++ ) {
|
||||||
sb.append(", ");
|
sb.append(", ");
|
||||||
( (SqmSelectableNode<?>) arguments.get( i ) ).appendHqlString( sb );
|
arguments.get( i ).appendHqlString( sb );
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
|
|
|
@ -83,7 +83,6 @@ import org.hibernate.metamodel.mapping.SelectableMappings;
|
||||||
import org.hibernate.metamodel.mapping.SqlExpressible;
|
import org.hibernate.metamodel.mapping.SqlExpressible;
|
||||||
import org.hibernate.metamodel.mapping.SqlTypedMapping;
|
import org.hibernate.metamodel.mapping.SqlTypedMapping;
|
||||||
import org.hibernate.metamodel.mapping.ValueMapping;
|
import org.hibernate.metamodel.mapping.ValueMapping;
|
||||||
import org.hibernate.metamodel.mapping.internal.EmbeddedCollectionPart;
|
|
||||||
import org.hibernate.metamodel.mapping.internal.EntityCollectionPart;
|
import org.hibernate.metamodel.mapping.internal.EntityCollectionPart;
|
||||||
import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl;
|
import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl;
|
||||||
import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping;
|
import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping;
|
||||||
|
@ -96,7 +95,6 @@ import org.hibernate.metamodel.model.domain.EmbeddableDomainType;
|
||||||
import org.hibernate.metamodel.model.domain.EntityDomainType;
|
import org.hibernate.metamodel.model.domain.EntityDomainType;
|
||||||
import org.hibernate.metamodel.model.domain.ManagedDomainType;
|
import org.hibernate.metamodel.model.domain.ManagedDomainType;
|
||||||
import org.hibernate.metamodel.model.domain.PluralPersistentAttribute;
|
import org.hibernate.metamodel.model.domain.PluralPersistentAttribute;
|
||||||
import org.hibernate.metamodel.model.domain.SimpleDomainType;
|
|
||||||
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
|
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
|
||||||
import org.hibernate.query.derived.AnonymousTupleTableGroupProducer;
|
import org.hibernate.query.derived.AnonymousTupleTableGroupProducer;
|
||||||
import org.hibernate.query.derived.AnonymousTupleType;
|
import org.hibernate.query.derived.AnonymousTupleType;
|
||||||
|
@ -323,7 +321,6 @@ import org.hibernate.sql.ast.tree.expression.TrimSpecification;
|
||||||
import org.hibernate.sql.ast.tree.expression.UnaryOperation;
|
import org.hibernate.sql.ast.tree.expression.UnaryOperation;
|
||||||
import org.hibernate.sql.ast.tree.from.CorrelatedPluralTableGroup;
|
import org.hibernate.sql.ast.tree.from.CorrelatedPluralTableGroup;
|
||||||
import org.hibernate.sql.ast.tree.from.CorrelatedTableGroup;
|
import org.hibernate.sql.ast.tree.from.CorrelatedTableGroup;
|
||||||
import org.hibernate.sql.ast.tree.from.LazyTableGroup;
|
|
||||||
import org.hibernate.sql.ast.tree.from.NamedTableReference;
|
import org.hibernate.sql.ast.tree.from.NamedTableReference;
|
||||||
import org.hibernate.sql.ast.tree.from.PluralTableGroup;
|
import org.hibernate.sql.ast.tree.from.PluralTableGroup;
|
||||||
import org.hibernate.sql.ast.tree.from.QueryPartTableGroup;
|
import org.hibernate.sql.ast.tree.from.QueryPartTableGroup;
|
||||||
|
@ -332,7 +329,6 @@ import org.hibernate.sql.ast.tree.from.SyntheticVirtualTableGroup;
|
||||||
import org.hibernate.sql.ast.tree.from.TableGroup;
|
import org.hibernate.sql.ast.tree.from.TableGroup;
|
||||||
import org.hibernate.sql.ast.tree.from.TableGroupJoin;
|
import org.hibernate.sql.ast.tree.from.TableGroupJoin;
|
||||||
import org.hibernate.sql.ast.tree.from.TableGroupJoinProducer;
|
import org.hibernate.sql.ast.tree.from.TableGroupJoinProducer;
|
||||||
import org.hibernate.sql.ast.tree.from.TableGroupProducer;
|
|
||||||
import org.hibernate.sql.ast.tree.from.TableReference;
|
import org.hibernate.sql.ast.tree.from.TableReference;
|
||||||
import org.hibernate.sql.ast.tree.from.VirtualTableGroup;
|
import org.hibernate.sql.ast.tree.from.VirtualTableGroup;
|
||||||
import org.hibernate.sql.ast.tree.insert.InsertStatement;
|
import org.hibernate.sql.ast.tree.insert.InsertStatement;
|
||||||
|
@ -1503,7 +1499,8 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
if ( selectableNode instanceof SqmPath<?> ) {
|
if ( selectableNode instanceof SqmPath<?> ) {
|
||||||
prepareForSelection( (SqmPath<?>) selectableNode );
|
prepareForSelection( (SqmPath<?>) selectableNode );
|
||||||
}
|
}
|
||||||
final DomainResultProducer<?> argumentResultProducer = (DomainResultProducer<?>) selectableNode.accept( this );
|
final DomainResultProducer<?> argumentResultProducer = (DomainResultProducer<?>) sqmArgument.accept( this );
|
||||||
|
|
||||||
dynamicInstantiation.addArgument( sqmArgument.getAlias(), argumentResultProducer, this );
|
dynamicInstantiation.addArgument( sqmArgument.getAlias(), argumentResultProducer, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ import org.hibernate.type.descriptor.java.JavaType;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface SqmTypedNode<T> extends SqmNode, SqmExpressibleAccessor<T> {
|
public interface SqmTypedNode<T> extends SqmNode, SqmExpressibleAccessor<T>, SqmVisitableNode {
|
||||||
/**
|
/**
|
||||||
* The Java type descriptor for this node.
|
* The Java type descriptor for this node.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,7 +19,7 @@ import org.hibernate.query.sqm.tree.SqmVisitableNode;
|
||||||
/**
|
/**
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
||||||
public class SqmCastTarget<T> extends AbstractSqmNode implements SqmTypedNode<T>, SqmVisitableNode {
|
public class SqmCastTarget<T> extends AbstractSqmNode implements SqmTypedNode<T> {
|
||||||
private final ReturnableType<T> type;
|
private final ReturnableType<T> type;
|
||||||
private final Long length;
|
private final Long length;
|
||||||
private final Integer precision;
|
private final Integer precision;
|
||||||
|
|
|
@ -12,12 +12,11 @@ import org.hibernate.query.sqm.SemanticQueryWalker;
|
||||||
import org.hibernate.query.sqm.tree.AbstractSqmNode;
|
import org.hibernate.query.sqm.tree.AbstractSqmNode;
|
||||||
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
||||||
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
||||||
import org.hibernate.query.sqm.tree.SqmVisitableNode;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
||||||
public class SqmDistinct<T> extends AbstractSqmNode implements SqmTypedNode<T>, SqmVisitableNode {
|
public class SqmDistinct<T> extends AbstractSqmNode implements SqmTypedNode<T> {
|
||||||
|
|
||||||
private final SqmExpression<T> expression;
|
private final SqmExpression<T> expression;
|
||||||
|
|
||||||
|
|
|
@ -14,12 +14,11 @@ import org.hibernate.query.sqm.SqmExpressible;
|
||||||
import org.hibernate.query.sqm.tree.AbstractSqmNode;
|
import org.hibernate.query.sqm.tree.AbstractSqmNode;
|
||||||
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
||||||
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
||||||
import org.hibernate.query.sqm.tree.SqmVisitableNode;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
||||||
public class SqmDurationUnit<T> extends AbstractSqmNode implements SqmTypedNode<T>, SqmVisitableNode {
|
public class SqmDurationUnit<T> extends AbstractSqmNode implements SqmTypedNode<T> {
|
||||||
private final TemporalUnit unit;
|
private final TemporalUnit unit;
|
||||||
private final ReturnableType<T> type;
|
private final ReturnableType<T> type;
|
||||||
|
|
||||||
|
|
|
@ -14,12 +14,11 @@ import org.hibernate.query.sqm.SqmExpressible;
|
||||||
import org.hibernate.query.sqm.tree.AbstractSqmNode;
|
import org.hibernate.query.sqm.tree.AbstractSqmNode;
|
||||||
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
||||||
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
||||||
import org.hibernate.query.sqm.tree.SqmVisitableNode;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
||||||
public class SqmExtractUnit<T> extends AbstractSqmNode implements SqmTypedNode<T>, SqmVisitableNode {
|
public class SqmExtractUnit<T> extends AbstractSqmNode implements SqmTypedNode<T> {
|
||||||
private final TemporalUnit unit;
|
private final TemporalUnit unit;
|
||||||
private final ReturnableType<T> type;
|
private final ReturnableType<T> type;
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ import org.hibernate.query.sqm.function.SqmFunctionDescriptor;
|
||||||
import org.hibernate.query.sqm.sql.SqmToSqlAstConverter;
|
import org.hibernate.query.sqm.sql.SqmToSqlAstConverter;
|
||||||
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
||||||
import org.hibernate.query.sqm.tree.domain.SqmPath;
|
import org.hibernate.query.sqm.tree.domain.SqmPath;
|
||||||
import org.hibernate.query.sqm.tree.select.SqmSelectableNode;
|
|
||||||
import org.hibernate.sql.ast.tree.expression.Expression;
|
import org.hibernate.sql.ast.tree.expression.Expression;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,38 +73,38 @@ public abstract class SqmFunction<T> extends AbstractSqmExpression<T>
|
||||||
switch ( functionName ) {
|
switch ( functionName ) {
|
||||||
case "cast": {
|
case "cast": {
|
||||||
sb.append( "cast(" );
|
sb.append( "cast(" );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( " as " );
|
sb.append( " as " );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 1 ) ).appendHqlString( sb );
|
arguments.get( 1 ).appendHqlString( sb );
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "extract": {
|
case "extract": {
|
||||||
sb.append( "extract(" );
|
sb.append( "extract(" );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( " from " );
|
sb.append( " from " );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 1 ) ).appendHqlString( sb );
|
arguments.get( 1 ).appendHqlString( sb );
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "format": {
|
case "format": {
|
||||||
sb.append( "format(" );
|
sb.append( "format(" );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( " as " );
|
sb.append( " as " );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 1 ) ).appendHqlString( sb );
|
arguments.get( 1 ).appendHqlString( sb );
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "overlay": {
|
case "overlay": {
|
||||||
sb.append( "overlay(" );
|
sb.append( "overlay(" );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( " placing " );
|
sb.append( " placing " );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 1 ) ).appendHqlString( sb );
|
arguments.get( 1 ).appendHqlString( sb );
|
||||||
sb.append( " from " );
|
sb.append( " from " );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 2 ) ).appendHqlString( sb );
|
arguments.get( 2 ).appendHqlString( sb );
|
||||||
if ( arguments.size() == 4 ) {
|
if ( arguments.size() == 4 ) {
|
||||||
sb.append( " for " );
|
sb.append( " for " );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 3 ) ).appendHqlString( sb );
|
arguments.get( 3 ).appendHqlString( sb );
|
||||||
}
|
}
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
break;
|
break;
|
||||||
|
@ -114,19 +113,19 @@ public abstract class SqmFunction<T> extends AbstractSqmExpression<T>
|
||||||
sb.append( "trim(" );
|
sb.append( "trim(" );
|
||||||
switch ( arguments.size() ) {
|
switch ( arguments.size() ) {
|
||||||
case 1:
|
case 1:
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( " from " );
|
sb.append( " from " );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 1 ) ).appendHqlString( sb );
|
arguments.get( 1 ).appendHqlString( sb );
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( ' ' );
|
sb.append( ' ' );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 1 ) ).appendHqlString( sb );
|
arguments.get( 1 ).appendHqlString( sb );
|
||||||
sb.append( " from " );
|
sb.append( " from " );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 3 ) ).appendHqlString( sb );
|
arguments.get( 3 ).appendHqlString( sb );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
|
@ -134,20 +133,20 @@ public abstract class SqmFunction<T> extends AbstractSqmExpression<T>
|
||||||
}
|
}
|
||||||
case "pad": {
|
case "pad": {
|
||||||
sb.append( "pad(" );
|
sb.append( "pad(" );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( " with" );
|
sb.append( " with" );
|
||||||
for ( int i = 1; i < arguments.size(); i++ ) {
|
for ( int i = 1; i < arguments.size(); i++ ) {
|
||||||
sb.append( ' ' );
|
sb.append( ' ' );
|
||||||
( (SqmSelectableNode<?>) arguments.get( i ) ).appendHqlString( sb );
|
arguments.get( i ).appendHqlString( sb );
|
||||||
}
|
}
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "position": {
|
case "position": {
|
||||||
sb.append( "position(" );
|
sb.append( "position(" );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
sb.append( " in " );
|
sb.append( " in " );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 1 ) ).appendHqlString( sb );
|
arguments.get( 1 ).appendHqlString( sb );
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -162,7 +161,7 @@ public abstract class SqmFunction<T> extends AbstractSqmExpression<T>
|
||||||
sb.append( '(' );
|
sb.append( '(' );
|
||||||
for ( int i = 1; i < arguments.size(); i++ ) {
|
for ( int i = 1; i < arguments.size(); i++ ) {
|
||||||
sb.append( ", " );
|
sb.append( ", " );
|
||||||
( (SqmSelectableNode<?>) arguments.get( i ) ).appendHqlString( sb );
|
arguments.get( i ).appendHqlString( sb );
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
|
|
|
@ -10,11 +10,9 @@ import org.hibernate.query.sqm.TrimSpec;
|
||||||
import org.hibernate.query.sqm.NodeBuilder;
|
import org.hibernate.query.sqm.NodeBuilder;
|
||||||
import org.hibernate.query.sqm.SqmExpressible;
|
import org.hibernate.query.sqm.SqmExpressible;
|
||||||
import org.hibernate.query.sqm.SemanticQueryWalker;
|
import org.hibernate.query.sqm.SemanticQueryWalker;
|
||||||
import org.hibernate.query.sqm.SqmExpressible;
|
|
||||||
import org.hibernate.query.sqm.tree.AbstractSqmNode;
|
import org.hibernate.query.sqm.tree.AbstractSqmNode;
|
||||||
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
||||||
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
||||||
import org.hibernate.query.sqm.tree.SqmVisitableNode;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Needed to pass TrimSpecification as an SqmExpression when we call out to
|
* Needed to pass TrimSpecification as an SqmExpression when we call out to
|
||||||
|
@ -22,7 +20,7 @@ import org.hibernate.query.sqm.tree.SqmVisitableNode;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class SqmTrimSpecification extends AbstractSqmNode implements SqmTypedNode<Void>, SqmVisitableNode {
|
public class SqmTrimSpecification extends AbstractSqmNode implements SqmTypedNode<Void> {
|
||||||
private final TrimSpec specification;
|
private final TrimSpec specification;
|
||||||
|
|
||||||
public SqmTrimSpecification(TrimSpec specification, NodeBuilder nodeBuilder) {
|
public SqmTrimSpecification(TrimSpec specification, NodeBuilder nodeBuilder) {
|
||||||
|
|
|
@ -220,10 +220,10 @@ public class SqmDynamicInstantiation<T>
|
||||||
sb.append( instantiationTarget.getTargetTypeDescriptor().getJavaTypeClass().getTypeName() );
|
sb.append( instantiationTarget.getTargetTypeDescriptor().getJavaTypeClass().getTypeName() );
|
||||||
}
|
}
|
||||||
sb.append( '(' );
|
sb.append( '(' );
|
||||||
( (SqmSelectableNode<?>) arguments.get( 0 ) ).appendHqlString( sb );
|
arguments.get( 0 ).appendHqlString( sb );
|
||||||
for ( int i = 1; i < arguments.size(); i++ ) {
|
for ( int i = 1; i < arguments.size(); i++ ) {
|
||||||
sb.append(", ");
|
sb.append(", ");
|
||||||
( (SqmSelectableNode<?>) arguments.get( i ) ).appendHqlString( sb );
|
arguments.get( i ).appendHqlString( sb );
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.append( ')' );
|
sb.append( ')' );
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
package org.hibernate.query.sqm.tree.select;
|
package org.hibernate.query.sqm.tree.select;
|
||||||
|
|
||||||
import org.hibernate.query.sqm.NodeBuilder;
|
import org.hibernate.query.sqm.NodeBuilder;
|
||||||
|
import org.hibernate.query.sqm.SemanticQueryWalker;
|
||||||
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -50,4 +51,17 @@ public class SqmDynamicInstantiationArgument<T> implements SqmAliasedNode<T> {
|
||||||
public NodeBuilder nodeBuilder() {
|
public NodeBuilder nodeBuilder() {
|
||||||
return nodeBuilder;
|
return nodeBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <X> X accept(SemanticQueryWalker<X> walker) {
|
||||||
|
return selectableNode.accept( walker );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void appendHqlString(StringBuilder sb) {
|
||||||
|
selectableNode.appendHqlString( sb );
|
||||||
|
if ( alias != null ) {
|
||||||
|
sb.append( " as " ).append( alias );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import jakarta.persistence.criteria.Selection;
|
||||||
import org.hibernate.query.criteria.JpaSelection;
|
import org.hibernate.query.criteria.JpaSelection;
|
||||||
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
||||||
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
import org.hibernate.query.sqm.tree.SqmTypedNode;
|
||||||
import org.hibernate.query.sqm.tree.SqmVisitableNode;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a SQM AST node that can be used as a selection in the query,
|
* Defines a SQM AST node that can be used as a selection in the query,
|
||||||
|
@ -20,7 +19,7 @@ import org.hibernate.query.sqm.tree.SqmVisitableNode;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface SqmSelectableNode<T> extends JpaSelection<T>, SqmTypedNode<T>, SqmVisitableNode {
|
public interface SqmSelectableNode<T> extends JpaSelection<T>, SqmTypedNode<T> {
|
||||||
/**
|
/**
|
||||||
* Visit each of this selectable's direct sub-selectables - used to
|
* Visit each of this selectable's direct sub-selectables - used to
|
||||||
* support JPA's {@link Selection} model (which is really a "selectable",
|
* support JPA's {@link Selection} model (which is really a "selectable",
|
||||||
|
|
|
@ -10,14 +10,13 @@ import org.hibernate.query.sqm.NodeBuilder;
|
||||||
import org.hibernate.query.sqm.SemanticQueryWalker;
|
import org.hibernate.query.sqm.SemanticQueryWalker;
|
||||||
import org.hibernate.query.sqm.tree.AbstractSqmNode;
|
import org.hibernate.query.sqm.tree.AbstractSqmNode;
|
||||||
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
import org.hibernate.query.sqm.tree.SqmCopyContext;
|
||||||
import org.hibernate.query.sqm.tree.SqmVisitableNode;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents an individual selection within a select clause.
|
* Represents an individual selection within a select clause.
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class SqmSelection<T> extends AbstractSqmNode implements SqmAliasedNode<T>, SqmVisitableNode {
|
public class SqmSelection<T> extends AbstractSqmNode implements SqmAliasedNode<T> {
|
||||||
private final SqmSelectableNode<T> selectableNode;
|
private final SqmSelectableNode<T> selectableNode;
|
||||||
private final String alias;
|
private final String alias;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue