HHH-14452 Support set operations in JPA Criteria API

This commit is contained in:
Christian Beikov 2021-02-18 17:58:17 +01:00
parent 222837df95
commit 6b66feb0ac
46 changed files with 1011 additions and 475 deletions

View File

@ -646,7 +646,7 @@ public <T> QueryImplementor<T> createQuery(String queryString, Class<T> resultCl
final QueryEngine queryEngine = getFactory().getQueryEngine(); final QueryEngine queryEngine = getFactory().getQueryEngine();
final QueryInterpretationCache interpretationCache = queryEngine.getInterpretationCache(); final QueryInterpretationCache interpretationCache = queryEngine.getInterpretationCache();
final QuerySqmImpl query = new QuerySqmImpl( final QuerySqmImpl<T> query = new QuerySqmImpl<>(
queryString, queryString,
interpretationCache.resolveHqlInterpretation( interpretationCache.resolveHqlInterpretation(
queryString, queryString,
@ -940,7 +940,7 @@ public <T> QueryImplementor<T> createQuery(CriteriaQuery<T> criteriaQuery) {
try { try {
return new QuerySqmImpl<>( return new QuerySqmImpl<>(
(SqmStatement) criteriaQuery, (SqmStatement<T>) criteriaQuery,
criteriaQuery.getResultType(), criteriaQuery.getResultType(),
this this
); );
@ -955,7 +955,7 @@ public QueryImplementor createQuery(CriteriaUpdate criteriaUpdate) {
checkOpen(); checkOpen();
try { try {
return new QuerySqmImpl<>( return new QuerySqmImpl<>(
(SqmUpdateStatement) criteriaUpdate, (SqmUpdateStatement<?>) criteriaUpdate,
null, null,
this this
); );
@ -970,7 +970,7 @@ public QueryImplementor createQuery(CriteriaDelete criteriaDelete) {
checkOpen(); checkOpen();
try { try {
return new QuerySqmImpl<>( return new QuerySqmImpl<>(
(SqmDeleteStatement) criteriaDelete, (SqmDeleteStatement<?>) criteriaDelete,
null, null,
this this
); );

View File

@ -451,8 +451,9 @@ public <T> EntityDomainType<T> resolveEntityReference(Class<T> javaType) {
// otherwise, try to handle it as a polymorphic reference // otherwise, try to handle it as a polymorphic reference
{ {
if ( polymorphicEntityReferenceMap.containsKey( javaType ) ) { EntityDomainType<T> polymorphicDomainType = (EntityDomainType<T>) polymorphicEntityReferenceMap.get( javaType );
return (EntityDomainType<T>) polymorphicEntityReferenceMap.get( javaType ); if ( polymorphicDomainType != null ) {
return polymorphicDomainType;
} }
final Set<EntityDomainType<?>> matchingDescriptors = new HashSet<>(); final Set<EntityDomainType<?>> matchingDescriptors = new HashSet<>();
@ -464,11 +465,11 @@ public <T> EntityDomainType<T> resolveEntityReference(Class<T> javaType) {
} }
); );
if ( !matchingDescriptors.isEmpty() ) { if ( !matchingDescriptors.isEmpty() ) {
final SqmPolymorphicRootDescriptor descriptor = new SqmPolymorphicRootDescriptor( final SqmPolymorphicRootDescriptor<T> descriptor = new SqmPolymorphicRootDescriptor<>(
typeConfiguration.getJavaTypeDescriptorRegistry().resolveDescriptor( javaType ), typeConfiguration.getJavaTypeDescriptorRegistry().resolveDescriptor( javaType ),
matchingDescriptors matchingDescriptors
); );
polymorphicEntityReferenceMap.put( javaType, descriptor ); polymorphicEntityReferenceMap.putIfAbsent( javaType, descriptor );
return descriptor; return descriptor;
} }
} }

View File

@ -18,6 +18,7 @@
import javax.persistence.Tuple; import javax.persistence.Tuple;
import javax.persistence.criteria.CollectionJoin; import javax.persistence.criteria.CollectionJoin;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression; import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join; import javax.persistence.criteria.Join;
import javax.persistence.criteria.ListJoin; import javax.persistence.criteria.ListJoin;
@ -33,6 +34,7 @@
import org.hibernate.SortOrder; import org.hibernate.SortOrder;
import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.query.sqm.tree.expression.SqmExpression; import org.hibernate.query.sqm.tree.expression.SqmExpression;
import org.hibernate.query.sqm.tree.select.SqmSelectQuery;
/** /**
* Hibernate extensions to the JPA CriteriaBuilder. * Hibernate extensions to the JPA CriteriaBuilder.
@ -70,6 +72,38 @@ public interface HibernateCriteriaBuilder extends CriteriaBuilder {
<T> JpaCriteriaInsertSelect<T> createCriteriaInsertSelect(Class<T> targetEntity); <T> JpaCriteriaInsertSelect<T> createCriteriaInsertSelect(Class<T> targetEntity);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Set operation
default <T> JpaCriteriaQuery<T> unionAll(CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries) {
return union( true, query1, queries );
}
default <T> JpaCriteriaQuery<T> union(CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries) {
return union( false, query1, queries );
}
<T> JpaCriteriaQuery<T> union(boolean all, CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries);
default <T> JpaCriteriaQuery<T> intersectAll(CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries) {
return intersect( true, query1, queries );
}
default <T> JpaCriteriaQuery<T> intersect(CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries) {
return intersect( false, query1, queries );
}
<T> JpaCriteriaQuery<T> intersect(boolean all, CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries);
default <T> JpaCriteriaQuery<T> exceptAll(CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries) {
return except( true, query1, queries );
}
default <T> JpaCriteriaQuery<T> except(CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries) {
return except( false, query1, queries );
}
<T> JpaCriteriaQuery<T> except(boolean all, CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Paths // Paths

View File

@ -16,6 +16,8 @@
import javax.persistence.criteria.Selection; import javax.persistence.criteria.Selection;
import javax.persistence.metamodel.EntityType; import javax.persistence.metamodel.EntityType;
import org.hibernate.FetchClauseType;
/** /**
* Extension of the JPA {@link CriteriaQuery} * Extension of the JPA {@link CriteriaQuery}
* *
@ -23,13 +25,34 @@
*/ */
public interface JpaCriteriaQuery<T> extends CriteriaQuery<T>, JpaQueryableCriteria<T>, JpaSelectCriteria<T> { public interface JpaCriteriaQuery<T> extends CriteriaQuery<T>, JpaQueryableCriteria<T>, JpaSelectCriteria<T> {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Limit/Offset/Fetch clause
JpaExpression<Number> getOffset();
JpaCriteriaQuery<T> offset(JpaExpression<? extends Number> offset);
JpaCriteriaQuery<T> offset(Number offset);
JpaExpression<Number> getFetch();
JpaCriteriaQuery<T> fetch(JpaExpression<? extends Number> fetch);
JpaCriteriaQuery<T> fetch(JpaExpression<? extends Number> fetch, FetchClauseType fetchClauseType);
JpaCriteriaQuery<T> fetch(Number fetch);
JpaCriteriaQuery<T> fetch(Number fetch, FetchClauseType fetchClauseType);
FetchClauseType getFetchClauseType();
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Accessors // Accessors
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
default List<Order> getOrderList() { default List<Order> getOrderList() {
return (List) getQuerySpec().getSortSpecifications(); return (List) getQueryPart().getSortSpecifications();
} }
/** /**

View File

@ -0,0 +1,38 @@
/*
* 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.criteria;
import java.util.List;
import org.hibernate.FetchClauseType;
import org.hibernate.SetOperator;
/**
* A query group i.e. query parts connected with a set operator.
*
* @author Christian Beikov
*/
public interface JpaQueryGroup<T> extends JpaQueryPart<T> {
List<? extends JpaQueryPart<T>> getQueryParts();
SetOperator getSetOperator();
void setSetOperator(SetOperator setOperator);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Covariant overrides
JpaQueryGroup<T> setSortSpecifications(List<? extends JpaOrder> sortSpecifications);
JpaQueryGroup<T> setOffset(JpaExpression<?> offset);
JpaQueryGroup<T> setFetch(JpaExpression<?> fetch);
JpaQueryGroup<T> setFetch(JpaExpression<?> fetch, FetchClauseType fetchClauseType);
}

View File

@ -0,0 +1,45 @@
/*
* 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.criteria;
import java.util.List;
import org.hibernate.FetchClauseType;
/**
* Models a query part i.e. the commonalities between a query group and a query specification.
*
* @see JpaQueryStructure
* @see JpaQueryGroup
*
* @author Christian Beikov
*/
public interface JpaQueryPart<T> extends JpaCriteriaNode {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Ordering clause
List<? extends JpaOrder> getSortSpecifications();
JpaQueryPart<T> setSortSpecifications(List<? extends JpaOrder> sortSpecifications);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Limit/Offset/Fetch clause
<X> JpaExpression<X> getOffset();
JpaQueryPart<T> setOffset(JpaExpression<?> offset);
<X> JpaExpression<X> getFetch();
JpaQueryPart<T> setFetch(JpaExpression<?> fetch);
JpaQueryPart<T> setFetch(JpaExpression<?> fetch, FetchClauseType fetchClauseType);
FetchClauseType getFetchClauseType();
}

View File

@ -27,7 +27,7 @@
* *
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public interface JpaQueryStructure<T> extends JpaCriteriaNode { public interface JpaQueryStructure<T> extends JpaQueryPart<T> {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Select clause // Select clause
@ -78,27 +78,14 @@ public interface JpaQueryStructure<T> extends JpaCriteriaNode {
JpaQueryStructure<T> setGroupRestriction(Predicate... restrictions); JpaQueryStructure<T> setGroupRestriction(Predicate... restrictions);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Ordering clause // Covariant overrides
List<? extends JpaOrder> getSortSpecifications();
JpaQueryStructure<T> setSortSpecifications(List<? extends JpaOrder> sortSpecifications); JpaQueryStructure<T> setSortSpecifications(List<? extends JpaOrder> sortSpecifications);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Limit/Offset/Fetch clause
<X> JpaExpression<X> getOffset();
JpaQueryStructure<T> setOffset(JpaExpression<?> offset); JpaQueryStructure<T> setOffset(JpaExpression<?> offset);
<X> JpaExpression<X> getFetch();
JpaQueryStructure<T> setFetch(JpaExpression<?> fetch); JpaQueryStructure<T> setFetch(JpaExpression<?> fetch);
JpaQueryStructure<T> setFetch(JpaExpression<?> fetch, FetchClauseType fetchClauseType); JpaQueryStructure<T> setFetch(JpaExpression<?> fetch, FetchClauseType fetchClauseType);
FetchClauseType getFetchClauseType();
} }

View File

@ -23,6 +23,10 @@ public interface JpaSelectCriteria<T> extends AbstractQuery<T>, JpaCriteriaBase
* The query structure. See {@link JpaQueryStructure} for details * The query structure. See {@link JpaQueryStructure} for details
*/ */
JpaQueryStructure<T> getQuerySpec(); JpaQueryStructure<T> getQuerySpec();
/**
* The query structure. See {@link JpaQueryStructure} for details
*/
JpaQueryPart<T> getQueryPart();
@Override @Override
JpaSelectCriteria<T> distinct(boolean distinct); JpaSelectCriteria<T> distinct(boolean distinct);

View File

@ -28,7 +28,7 @@ public interface HqlTranslator {
* *
* @return The semantic representation of the incoming query. * @return The semantic representation of the incoming query.
*/ */
SqmStatement translate(String hql); <R> SqmStatement<R> translate(String hql);
/** /**
* Give the translator a chance to "shut down" if it needs to * Give the translator a chance to "shut down" if it needs to

View File

@ -43,6 +43,7 @@
import org.hibernate.query.sqm.tree.from.SqmFrom; import org.hibernate.query.sqm.tree.from.SqmFrom;
import org.hibernate.query.sqm.tree.from.SqmFromClause; import org.hibernate.query.sqm.tree.from.SqmFromClause;
import org.hibernate.query.sqm.tree.from.SqmRoot; import org.hibernate.query.sqm.tree.from.SqmRoot;
import org.hibernate.query.sqm.tree.insert.SqmInsertSelectStatement;
import org.hibernate.query.sqm.tree.predicate.SqmAndPredicate; import org.hibernate.query.sqm.tree.predicate.SqmAndPredicate;
import org.hibernate.query.sqm.tree.predicate.SqmBetweenPredicate; import org.hibernate.query.sqm.tree.predicate.SqmBetweenPredicate;
import org.hibernate.query.sqm.tree.predicate.SqmComparisonPredicate; import org.hibernate.query.sqm.tree.predicate.SqmComparisonPredicate;
@ -72,6 +73,7 @@
import org.hibernate.query.sqm.tree.update.SqmAssignment; import org.hibernate.query.sqm.tree.update.SqmAssignment;
import org.hibernate.query.sqm.tree.update.SqmSetClause; import org.hibernate.query.sqm.tree.update.SqmSetClause;
import org.hibernate.query.sqm.tree.update.SqmUpdateStatement; import org.hibernate.query.sqm.tree.update.SqmUpdateStatement;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
/** /**
* Handles splitting queries containing unmapped polymorphic references. * Handles splitting queries containing unmapped polymorphic references.
@ -79,25 +81,25 @@
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class QuerySplitter { public class QuerySplitter {
public static SqmSelectStatement[] split( public static <R> SqmSelectStatement<R>[] split(
SqmSelectStatement statement, SqmSelectStatement<R> statement,
SessionFactoryImplementor sessionFactory) { SessionFactoryImplementor sessionFactory) {
// We only allow unmapped polymorphism in a very restricted way. Specifically, // We only allow unmapped polymorphism in a very restricted way. Specifically,
// the unmapped polymorphic reference can only be a root and can be the only // the unmapped polymorphic reference can only be a root and can be the only
// root. Use that restriction to locate the unmapped polymorphic reference // root. Use that restriction to locate the unmapped polymorphic reference
final SqmRoot unmappedPolymorphicReference = findUnmappedPolymorphicReference( statement ); final SqmRoot<?> unmappedPolymorphicReference = findUnmappedPolymorphicReference( statement.getQueryPart() );
if ( unmappedPolymorphicReference == null ) { if ( unmappedPolymorphicReference == null ) {
return new SqmSelectStatement[] { statement }; return new SqmSelectStatement[] { statement };
} }
final SqmPolymorphicRootDescriptor<?> unmappedPolymorphicDescriptor = (SqmPolymorphicRootDescriptor) unmappedPolymorphicReference.getReferencedPathSource(); final SqmPolymorphicRootDescriptor<?> unmappedPolymorphicDescriptor = (SqmPolymorphicRootDescriptor<?>) unmappedPolymorphicReference.getReferencedPathSource();
final SqmSelectStatement[] expanded = new SqmSelectStatement[ unmappedPolymorphicDescriptor.getImplementors().size() ]; final SqmSelectStatement<R>[] expanded = new SqmSelectStatement[ unmappedPolymorphicDescriptor.getImplementors().size() ];
int i = -1; int i = -1;
for ( EntityDomainType<?> mappedDescriptor : unmappedPolymorphicDescriptor.getImplementors() ) { for ( EntityDomainType<?> mappedDescriptor : unmappedPolymorphicDescriptor.getImplementors() ) {
i++; i++;
final UnmappedPolymorphismReplacer replacer = new UnmappedPolymorphismReplacer( final UnmappedPolymorphismReplacer<R> replacer = new UnmappedPolymorphismReplacer<>(
unmappedPolymorphicReference, unmappedPolymorphicReference,
mappedDescriptor, mappedDescriptor,
sessionFactory sessionFactory
@ -108,18 +110,26 @@ public static SqmSelectStatement[] split(
return expanded; return expanded;
} }
private static SqmRoot findUnmappedPolymorphicReference(SqmSelectStatement statement) { private static SqmRoot<?> findUnmappedPolymorphicReference(SqmQueryPart<?> queryPart) {
return statement.getQuerySpec() if ( queryPart instanceof SqmQuerySpec<?> ) {
.getFromClause() return ( (SqmQuerySpec<?>) queryPart ).getRoots()
.getRoots() .stream()
.stream() .filter( sqmRoot -> sqmRoot.getReferencedPathSource() instanceof SqmPolymorphicRootDescriptor )
.filter( sqmRoot -> sqmRoot.getReferencedPathSource() instanceof SqmPolymorphicRootDescriptor ) .findFirst()
.findFirst() .orElse( null );
.orElse( null ); }
else {
final SqmQueryGroup<?> queryGroup = (SqmQueryGroup<?>) queryPart;
final SqmRoot<?> root = findUnmappedPolymorphicReference( queryGroup.getQueryParts().get( 0 ) );
if ( root != null ) {
throw new UnsupportedOperationException( "Polymorphic query group is unsupported!" );
}
return null;
}
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private static class UnmappedPolymorphismReplacer extends BaseSemanticQueryWalker implements SqmCreationState { private static class UnmappedPolymorphismReplacer<R> extends BaseSemanticQueryWalker implements SqmCreationState {
private final SqmRoot unmappedPolymorphicFromElement; private final SqmRoot unmappedPolymorphicFromElement;
private final EntityDomainType mappedDescriptor; private final EntityDomainType mappedDescriptor;
private final SqmCreationContext creationContext; private final SqmCreationContext creationContext;
@ -139,7 +149,12 @@ private UnmappedPolymorphismReplacer(
} }
@Override @Override
public SqmUpdateStatement visitUpdateStatement(SqmUpdateStatement statement) { public SqmInsertSelectStatement<R> visitInsertSelectStatement(SqmInsertSelectStatement<?> statement) {
throw new UnsupportedOperationException( "Not valid" );
}
@Override
public SqmUpdateStatement<R> visitUpdateStatement(SqmUpdateStatement<?> statement) {
throw new UnsupportedOperationException( "Not valid" ); throw new UnsupportedOperationException( "Not valid" );
} }
@ -154,13 +169,13 @@ public SqmAssignment visitAssignment(SqmAssignment assignment) {
} }
@Override @Override
public SqmDeleteStatement visitDeleteStatement(SqmDeleteStatement statement) { public SqmDeleteStatement<R> visitDeleteStatement(SqmDeleteStatement<?> statement) {
throw new UnsupportedOperationException( "Not valid" ); throw new UnsupportedOperationException( "Not valid" );
} }
@Override @Override
public SqmSelectStatement visitSelectStatement(SqmSelectStatement statement) { public SqmSelectStatement<R> visitSelectStatement(SqmSelectStatement<?> statement) {
final SqmSelectStatement copy = new SqmSelectStatement( statement.nodeBuilder() ); final SqmSelectStatement<R> copy = new SqmSelectStatement<>( statement.nodeBuilder() );
processingStateStack.push( processingStateStack.push(
new SqmQuerySpecCreationProcessingStateStandardImpl( new SqmQuerySpecCreationProcessingStateStandardImpl(
@ -180,28 +195,28 @@ public SqmSelectStatement visitSelectStatement(SqmSelectStatement statement) {
} }
@Override @Override
public SqmQueryPart visitQueryPart(SqmQueryPart<?> queryPart) { public SqmQueryPart<R> visitQueryPart(SqmQueryPart<?> queryPart) {
return (SqmQueryPart) super.visitQueryPart( queryPart ); return (SqmQueryPart<R>) super.visitQueryPart( queryPart );
} }
@Override @Override
public SqmQueryGroup visitQueryGroup(SqmQueryGroup<?> queryGroup) { public SqmQueryGroup<R> visitQueryGroup(SqmQueryGroup<?> queryGroup) {
final List<? extends SqmQueryPart<?>> queryParts = queryGroup.getQueryParts(); final List<? extends SqmQueryPart<?>> queryParts = queryGroup.getQueryParts();
final int size = queryParts.size(); final int size = queryParts.size();
final List<SqmQueryPart<?>> newQueryParts = new ArrayList<>( size ); final List<SqmQueryPart<R>> newQueryParts = new ArrayList<>( size );
for ( int i = 0; i < size; i++ ) { for ( int i = 0; i < size; i++ ) {
newQueryParts.add( visitQueryPart( queryParts.get( i ) ) ); newQueryParts.add( visitQueryPart( queryParts.get( i ) ) );
} }
return new SqmQueryGroup( queryGroup.nodeBuilder(), queryGroup.getSetOperator(), newQueryParts ); return new SqmQueryGroup<>( queryGroup.nodeBuilder(), queryGroup.getSetOperator(), newQueryParts );
} }
@Override @Override
public SqmQuerySpec visitQuerySpec(SqmQuerySpec querySpec) { public SqmQuerySpec<R> visitQuerySpec(SqmQuerySpec<?> querySpec) {
// NOTE : it is important that we visit the SqmFromClause first so that the // NOTE : it is important that we visit the SqmFromClause first so that the
// fromElementCopyMap gets built before other parts of the queryspec // fromElementCopyMap gets built before other parts of the queryspec
// are visited // are visited
final SqmQuerySpec sqmQuerySpec = new SqmQuerySpec( querySpec.nodeBuilder() ); final SqmQuerySpec<R> sqmQuerySpec = new SqmQuerySpec<>( querySpec.nodeBuilder() );
sqmQuerySpec.setFromClause( visitFromClause( querySpec.getFromClause() ) ); sqmQuerySpec.setFromClause( visitFromClause( querySpec.getFromClause() ) );
sqmQuerySpec.setSelectClause( visitSelectClause( querySpec.getSelectClause() ) ); sqmQuerySpec.setSelectClause( visitSelectClause( querySpec.getSelectClause() ) );
sqmQuerySpec.setWhereClause( visitWhereClause( querySpec.getWhereClause() ) ); sqmQuerySpec.setWhereClause( visitWhereClause( querySpec.getWhereClause() ) );
@ -210,12 +225,12 @@ public SqmQuerySpec visitQuerySpec(SqmQuerySpec querySpec) {
sqmQuerySpec.setOrderByClause( visitOrderByClause( querySpec.getOrderByClause() ) ); sqmQuerySpec.setOrderByClause( visitOrderByClause( querySpec.getOrderByClause() ) );
if ( querySpec.getFetchExpression() != null ) { if ( querySpec.getFetchExpression() != null ) {
sqmQuerySpec.setFetchExpression( sqmQuerySpec.setFetchExpression(
(SqmExpression) querySpec.getFetchExpression().accept( this ), (SqmExpression<?>) querySpec.getFetchExpression().accept( this ),
querySpec.getFetchClauseType() querySpec.getFetchClauseType()
); );
} }
if ( querySpec.getOffsetExpression() != null ) { if ( querySpec.getOffsetExpression() != null ) {
sqmQuerySpec.setOffsetExpression( (SqmExpression) querySpec.getOffsetExpression().accept( this ) ); sqmQuerySpec.setOffsetExpression( (SqmExpression<?>) querySpec.getOffsetExpression().accept( this ) );
} }
return sqmQuerySpec; return sqmQuerySpec;
@ -259,24 +274,24 @@ public SqmPredicate visitHavingClause(SqmPredicate sqmPredicate) {
} }
@Override @Override
public SqmRoot visitRootPath(SqmRoot sqmRoot) { public SqmRoot<?> visitRootPath(SqmRoot<?> sqmRoot) {
final SqmFrom sqmFrom = sqmFromCopyMap.get( sqmRoot ); final SqmFrom<?, ?> sqmFrom = sqmFromCopyMap.get( sqmRoot );
if ( sqmFrom != null ) { if ( sqmFrom != null ) {
return (SqmRoot) sqmFrom; return (SqmRoot<?>) sqmFrom;
} }
final EntityDomainType pathSource; final EntityDomainType<?> pathSource;
if ( sqmRoot == unmappedPolymorphicFromElement ) { if ( sqmRoot == unmappedPolymorphicFromElement ) {
pathSource = mappedDescriptor; pathSource = mappedDescriptor;
} }
else { else {
pathSource = sqmRoot.getReferencedPathSource(); pathSource = sqmRoot.getReferencedPathSource();
} }
final SqmRoot copy = new SqmRoot( final SqmRoot<?> copy = new SqmRoot<>(
pathSource, pathSource,
sqmRoot.getExplicitAlias(), sqmRoot.getExplicitAlias(),
sqmRoot.nodeBuilder() sqmRoot.nodeBuilder()
); );
return (SqmRoot) getProcessingStateStack().getCurrent().getPathRegistry().resolvePath( return (SqmRoot<?>) getProcessingStateStack().getCurrent().getPathRegistry().resolvePath(
copy.getNavigablePath(), copy.getNavigablePath(),
navigablePath -> { navigablePath -> {
sqmFromCopyMap.put( sqmRoot, copy ); sqmFromCopyMap.put( sqmRoot, copy );
@ -288,16 +303,16 @@ public SqmRoot visitRootPath(SqmRoot sqmRoot) {
} }
@Override @Override
public SqmCrossJoin visitCrossJoin(SqmCrossJoin join) { public SqmCrossJoin<?> visitCrossJoin(SqmCrossJoin<?> join) {
final SqmFrom sqmFrom = sqmFromCopyMap.get( join ); final SqmFrom<?, ?> sqmFrom = sqmFromCopyMap.get( join );
if ( sqmFrom != null ) { if ( sqmFrom != null ) {
return (SqmCrossJoin) sqmFrom; return (SqmCrossJoin<?>) sqmFrom;
} }
return (SqmCrossJoin) getProcessingStateStack().getCurrent().getPathRegistry().resolvePath( return (SqmCrossJoin<?>) getProcessingStateStack().getCurrent().getPathRegistry().resolvePath(
join.getNavigablePath(), join.getNavigablePath(),
navigablePath -> { navigablePath -> {
final SqmRoot sqmRoot = (SqmRoot) sqmFromCopyMap.get( join.findRoot() ); final SqmRoot<?> sqmRoot = (SqmRoot<?>) sqmFromCopyMap.get( join.findRoot() );
final SqmCrossJoin copy = new SqmCrossJoin( final SqmCrossJoin copy = new SqmCrossJoin<>(
join.getReferencedPathSource(), join.getReferencedPathSource(),
join.getExplicitAlias(), join.getExplicitAlias(),
sqmRoot sqmRoot
@ -311,16 +326,16 @@ public SqmCrossJoin visitCrossJoin(SqmCrossJoin join) {
} }
@Override @Override
public SqmEntityJoin visitQualifiedEntityJoin(SqmEntityJoin join) { public SqmEntityJoin<?> visitQualifiedEntityJoin(SqmEntityJoin<?> join) {
final SqmFrom sqmFrom = sqmFromCopyMap.get( join ); final SqmFrom<?, ?> sqmFrom = sqmFromCopyMap.get( join );
if ( sqmFrom != null ) { if ( sqmFrom != null ) {
return (SqmEntityJoin) sqmFrom; return (SqmEntityJoin<?>) sqmFrom;
} }
return (SqmEntityJoin) getProcessingStateStack().getCurrent().getPathRegistry().resolvePath( return (SqmEntityJoin<?>) getProcessingStateStack().getCurrent().getPathRegistry().resolvePath(
join.getNavigablePath(), join.getNavigablePath(),
navigablePath -> { navigablePath -> {
final SqmRoot sqmRoot = (SqmRoot) sqmFromCopyMap.get( join.findRoot() ); final SqmRoot<?> sqmRoot = (SqmRoot<?>) sqmFromCopyMap.get( join.findRoot() );
final SqmEntityJoin copy = new SqmEntityJoin( final SqmEntityJoin copy = new SqmEntityJoin<>(
join.getReferencedPathSource(), join.getReferencedPathSource(),
join.getExplicitAlias(), join.getExplicitAlias(),
join.getSqmJoinType(), join.getSqmJoinType(),
@ -335,12 +350,12 @@ public SqmEntityJoin visitQualifiedEntityJoin(SqmEntityJoin join) {
} }
@Override @Override
public SqmAttributeJoin visitQualifiedAttributeJoin(SqmAttributeJoin join) { public SqmAttributeJoin<?, ?> visitQualifiedAttributeJoin(SqmAttributeJoin<?, ?> join) {
SqmFrom sqmFrom = sqmFromCopyMap.get( join ); SqmFrom<?, ?> sqmFrom = sqmFromCopyMap.get( join );
if ( sqmFrom != null ) { if ( sqmFrom != null ) {
return (SqmAttributeJoin) sqmFrom; return (SqmAttributeJoin<?, ?>) sqmFrom;
} }
return (SqmAttributeJoin) getProcessingStateStack().getCurrent().getPathRegistry().resolvePath( return (SqmAttributeJoin<?, ?>) getProcessingStateStack().getCurrent().getPathRegistry().resolvePath(
join.getNavigablePath(), join.getNavigablePath(),
navigablePath -> { navigablePath -> {
SqmAttributeJoin copy = join.makeCopy( getProcessingStateStack().getCurrent() ); SqmAttributeJoin copy = join.makeCopy( getProcessingStateStack().getCurrent() );
@ -353,13 +368,13 @@ public SqmAttributeJoin visitQualifiedAttributeJoin(SqmAttributeJoin join) {
} }
@Override @Override
public SqmBasicValuedSimplePath visitBasicValuedPath(SqmBasicValuedSimplePath path) { public SqmBasicValuedSimplePath<?> visitBasicValuedPath(SqmBasicValuedSimplePath<?> path) {
final SqmPathRegistry pathRegistry = getProcessingStateStack().getCurrent().getPathRegistry(); final SqmPathRegistry pathRegistry = getProcessingStateStack().getCurrent().getPathRegistry();
return (SqmBasicValuedSimplePath) pathRegistry.resolvePath( return (SqmBasicValuedSimplePath<?>) pathRegistry.resolvePath(
path.getNavigablePath(), path.getNavigablePath(),
navigablePath -> { navigablePath -> {
final SqmBasicValuedSimplePath copy = new SqmBasicValuedSimplePath( final SqmBasicValuedSimplePath<?> copy = new SqmBasicValuedSimplePath<>(
navigablePath, navigablePath,
path.getReferencedPathSource(), path.getReferencedPathSource(),
pathRegistry.findFromByPath( path.getLhs().getNavigablePath() ), pathRegistry.findFromByPath( path.getLhs().getNavigablePath() ),
@ -372,13 +387,13 @@ public SqmBasicValuedSimplePath visitBasicValuedPath(SqmBasicValuedSimplePath pa
} }
@Override @Override
public SqmEmbeddedValuedSimplePath visitEmbeddableValuedPath(SqmEmbeddedValuedSimplePath path) { public SqmEmbeddedValuedSimplePath<?> visitEmbeddableValuedPath(SqmEmbeddedValuedSimplePath<?> path) {
final SqmPathRegistry pathRegistry = getProcessingStateStack().getCurrent().getPathRegistry(); final SqmPathRegistry pathRegistry = getProcessingStateStack().getCurrent().getPathRegistry();
return (SqmEmbeddedValuedSimplePath) pathRegistry.resolvePath( return (SqmEmbeddedValuedSimplePath<?>) pathRegistry.resolvePath(
path.getNavigablePath(), path.getNavigablePath(),
navigablePath -> { navigablePath -> {
final SqmEmbeddedValuedSimplePath copy = new SqmEmbeddedValuedSimplePath( final SqmEmbeddedValuedSimplePath<?> copy = new SqmEmbeddedValuedSimplePath<>(
navigablePath, navigablePath,
path.getReferencedPathSource(), path.getReferencedPathSource(),
pathRegistry.findFromByPath( path.getLhs().getNavigablePath() ), pathRegistry.findFromByPath( path.getLhs().getNavigablePath() ),
@ -391,13 +406,13 @@ public SqmEmbeddedValuedSimplePath visitEmbeddableValuedPath(SqmEmbeddedValuedSi
} }
@Override @Override
public SqmEntityValuedSimplePath visitEntityValuedPath(SqmEntityValuedSimplePath path) { public SqmEntityValuedSimplePath<?> visitEntityValuedPath(SqmEntityValuedSimplePath<?> path) {
final SqmPathRegistry pathRegistry = getProcessingStateStack().getCurrent().getPathRegistry(); final SqmPathRegistry pathRegistry = getProcessingStateStack().getCurrent().getPathRegistry();
return (SqmEntityValuedSimplePath) pathRegistry.resolvePath( return (SqmEntityValuedSimplePath<?>) pathRegistry.resolvePath(
path.getNavigablePath(), path.getNavigablePath(),
navigablePath -> { navigablePath -> {
final SqmEntityValuedSimplePath copy = new SqmEntityValuedSimplePath( final SqmEntityValuedSimplePath<?> copy = new SqmEntityValuedSimplePath<>(
navigablePath, navigablePath,
path.getReferencedPathSource(), path.getReferencedPathSource(),
pathRegistry.findFromByPath( path.getLhs().getNavigablePath() ), pathRegistry.findFromByPath( path.getLhs().getNavigablePath() ),
@ -410,13 +425,13 @@ public SqmEntityValuedSimplePath visitEntityValuedPath(SqmEntityValuedSimplePath
} }
@Override @Override
public SqmPluralValuedSimplePath visitPluralValuedPath(SqmPluralValuedSimplePath path) { public SqmPluralValuedSimplePath<?> visitPluralValuedPath(SqmPluralValuedSimplePath<?> path) {
final SqmPathRegistry pathRegistry = getProcessingStateStack().getCurrent().getPathRegistry(); final SqmPathRegistry pathRegistry = getProcessingStateStack().getCurrent().getPathRegistry();
return (SqmPluralValuedSimplePath) pathRegistry.resolvePath( return (SqmPluralValuedSimplePath<?>) pathRegistry.resolvePath(
path.getNavigablePath(), path.getNavigablePath(),
navigablePath -> { navigablePath -> {
final SqmPluralValuedSimplePath copy = new SqmPluralValuedSimplePath( final SqmPluralValuedSimplePath<?> copy = new SqmPluralValuedSimplePath<>(
navigablePath, navigablePath,
path.getReferencedPathSource(), path.getReferencedPathSource(),
pathRegistry.findFromByPath( path.getLhs().getNavigablePath() ), pathRegistry.findFromByPath( path.getLhs().getNavigablePath() ),
@ -431,10 +446,10 @@ public SqmPluralValuedSimplePath visitPluralValuedPath(SqmPluralValuedSimplePath
@Override @Override
public SqmSelectClause visitSelectClause(SqmSelectClause selectClause) { public SqmSelectClause visitSelectClause(SqmSelectClause selectClause) {
SqmSelectClause copy = new SqmSelectClause( selectClause.isDistinct(), selectClause.nodeBuilder() ); SqmSelectClause copy = new SqmSelectClause( selectClause.isDistinct(), selectClause.nodeBuilder() );
for ( SqmSelection selection : selectClause.getSelections() ) { for ( SqmSelection<?> selection : selectClause.getSelections() ) {
copy.addSelection( copy.addSelection(
new SqmSelection( new SqmSelection<>(
(SqmExpression) selection.getSelectableNode().accept( this ), (SqmExpression<?>) selection.getSelectableNode().accept( this ),
selection.getAlias(), selection.getAlias(),
selectClause.nodeBuilder() selectClause.nodeBuilder()
) )
@ -444,21 +459,21 @@ public SqmSelectClause visitSelectClause(SqmSelectClause selectClause) {
} }
@Override @Override
public SqmDynamicInstantiation visitDynamicInstantiation(SqmDynamicInstantiation original) { public SqmDynamicInstantiation<?> visitDynamicInstantiation(SqmDynamicInstantiation<?> original) {
final SqmDynamicInstantiationTarget instantiationTarget = original.getInstantiationTarget(); final SqmDynamicInstantiationTarget<?> instantiationTarget = original.getInstantiationTarget();
final SqmDynamicInstantiation copy; final SqmDynamicInstantiation<?> copy;
switch ( instantiationTarget.getNature() ) { switch ( instantiationTarget.getNature() ) {
case MAP: { case MAP: {
copy = SqmDynamicInstantiation.forMapInstantiation( copy = SqmDynamicInstantiation.forMapInstantiation(
instantiationTarget.getTargetTypeDescriptor(), (JavaTypeDescriptor<Map<?, ?>>) instantiationTarget.getTargetTypeDescriptor(),
getCreationContext().getNodeBuilder() getCreationContext().getNodeBuilder()
); );
break; break;
} }
case LIST: { case LIST: {
copy = SqmDynamicInstantiation.forListInstantiation( copy = SqmDynamicInstantiation.forListInstantiation(
instantiationTarget.getTargetTypeDescriptor(), (JavaTypeDescriptor<List<?>>) instantiationTarget.getTargetTypeDescriptor(),
getCreationContext().getNodeBuilder() getCreationContext().getNodeBuilder()
); );
break; break;
@ -471,10 +486,10 @@ public SqmDynamicInstantiation visitDynamicInstantiation(SqmDynamicInstantiation
} }
} }
for ( SqmDynamicInstantiationArgument originalArgument : ( (SqmDynamicInstantiation<?>) original ).getArguments() ) { for ( SqmDynamicInstantiationArgument<?> originalArgument : original.getArguments() ) {
copy.addArgument( copy.addArgument(
new SqmDynamicInstantiationArgument( new SqmDynamicInstantiationArgument<>(
( SqmSelectableNode) originalArgument.getSelectableNode().accept( this ), ( SqmSelectableNode<?>) originalArgument.getSelectableNode().accept( this ),
originalArgument.getAlias(), originalArgument.getAlias(),
getCreationContext().getNodeBuilder() getCreationContext().getNodeBuilder()
) )

View File

@ -212,7 +212,7 @@
* *
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class SemanticQueryBuilder extends HqlParserBaseVisitor implements SqmCreationState { public class SemanticQueryBuilder<R> extends HqlParserBaseVisitor<Object> implements SqmCreationState {
private static final Logger log = Logger.getLogger( SemanticQueryBuilder.class ); private static final Logger log = Logger.getLogger( SemanticQueryBuilder.class );
@ -221,11 +221,11 @@ public class SemanticQueryBuilder extends HqlParserBaseVisitor implements SqmCre
* query. * query.
*/ */
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
public static SqmStatement buildSemanticModel( public static <R> SqmStatement<R> buildSemanticModel(
HqlParser.StatementContext hqlParseTree, HqlParser.StatementContext hqlParseTree,
SqmCreationOptions creationOptions, SqmCreationOptions creationOptions,
SqmCreationContext creationContext) { SqmCreationContext creationContext) {
return new SemanticQueryBuilder( creationOptions, creationContext ).visitStatement( hqlParseTree ); return new SemanticQueryBuilder<R>( creationOptions, creationContext ).visitStatement( hqlParseTree );
} }
private final SqmCreationOptions creationOptions; private final SqmCreationOptions creationOptions;
@ -271,7 +271,7 @@ protected Stack<ParameterDeclarationContext> getParameterDeclarationContextStack
// Grammar rules // Grammar rules
@Override @Override
public SqmStatement visitStatement(HqlParser.StatementContext ctx) { public SqmStatement<R> visitStatement(HqlParser.StatementContext ctx) {
// parameters allow multi-valued bindings only in very limited cases, so for // parameters allow multi-valued bindings only in very limited cases, so for
// the base case here we say false // the base case here we say false
parameterDeclarationContextStack.push( () -> false ); parameterDeclarationContextStack.push( () -> false );
@ -302,9 +302,9 @@ else if ( ctx.deleteStatement() != null ) {
// Top-level statements // Top-level statements
@Override @Override
public SqmSelectStatement visitSelectStatement(HqlParser.SelectStatementContext ctx) { public SqmSelectStatement<R> visitSelectStatement(HqlParser.SelectStatementContext ctx) {
final HqlParser.QueryExpressionContext queryExpressionContext = ctx.queryExpression(); final HqlParser.QueryExpressionContext queryExpressionContext = ctx.queryExpression();
final SqmSelectStatement selectStatement = new SqmSelectStatement( creationContext.getNodeBuilder() ); final SqmSelectStatement<R> selectStatement = new SqmSelectStatement<>( creationContext.getNodeBuilder() );
parameterCollector = selectStatement; parameterCollector = selectStatement;
@ -327,17 +327,16 @@ public SqmSelectStatement visitSelectStatement(HqlParser.SelectStatementContext
} }
@Override @Override
public SqmInsertStatement visitInsertStatement(HqlParser.InsertStatementContext ctx) { public SqmInsertStatement<R> visitInsertStatement(HqlParser.InsertStatementContext ctx) {
final SqmRoot<R> root = new SqmRoot<>(
final SqmRoot<?> root = new SqmRoot<>( (EntityDomainType<R>) visitEntityName( ctx.dmlTarget().entityName() ),
visitEntityName( ctx.dmlTarget().entityName() ),
applyJpaCompliance( visitIdentificationVariableDef( ctx.dmlTarget().identificationVariableDef() ) ), applyJpaCompliance( visitIdentificationVariableDef( ctx.dmlTarget().identificationVariableDef() ) ),
creationContext.getNodeBuilder() creationContext.getNodeBuilder()
); );
final HqlParser.QueryExpressionContext queryExpressionContext = ctx.queryExpression(); final HqlParser.QueryExpressionContext queryExpressionContext = ctx.queryExpression();
if ( queryExpressionContext != null ) { if ( queryExpressionContext != null ) {
final SqmInsertSelectStatement<?> insertStatement = new SqmInsertSelectStatement<>( root, creationContext.getNodeBuilder() ); final SqmInsertSelectStatement<R> insertStatement = new SqmInsertSelectStatement<>( root, creationContext.getNodeBuilder() );
parameterCollector = insertStatement; parameterCollector = insertStatement;
final SqmDmlCreationProcessingState processingState = new SqmDmlCreationProcessingState( final SqmDmlCreationProcessingState processingState = new SqmDmlCreationProcessingState(
insertStatement, insertStatement,
@ -358,7 +357,7 @@ public SqmInsertStatement visitInsertStatement(HqlParser.InsertStatementContext
processingStateStack.push( stateFieldsProcessingState ); processingStateStack.push( stateFieldsProcessingState );
try { try {
for ( HqlParser.DotIdentifierSequenceContext stateFieldCtx : ctx.targetFieldsSpec().dotIdentifierSequence() ) { for ( HqlParser.DotIdentifierSequenceContext stateFieldCtx : ctx.targetFieldsSpec().dotIdentifierSequence() ) {
final SqmPath stateField = (SqmPath) visitDotIdentifierSequence( stateFieldCtx ); final SqmPath<?> stateField = (SqmPath<?>) visitDotIdentifierSequence( stateFieldCtx );
// todo : validate each resolved stateField... // todo : validate each resolved stateField...
insertStatement.addInsertTargetStateField( stateField ); insertStatement.addInsertTargetStateField( stateField );
} }
@ -375,7 +374,7 @@ public SqmInsertStatement visitInsertStatement(HqlParser.InsertStatementContext
} }
else { else {
final SqmInsertValuesStatement<?> insertStatement = new SqmInsertValuesStatement<>( root, creationContext.getNodeBuilder() ); final SqmInsertValuesStatement<R> insertStatement = new SqmInsertValuesStatement<>( root, creationContext.getNodeBuilder() );
parameterCollector = insertStatement; parameterCollector = insertStatement;
final SqmDmlCreationProcessingState processingState = new SqmDmlCreationProcessingState( final SqmDmlCreationProcessingState processingState = new SqmDmlCreationProcessingState(
insertStatement, insertStatement,
@ -389,7 +388,7 @@ public SqmInsertStatement visitInsertStatement(HqlParser.InsertStatementContext
for ( HqlParser.ValuesContext values : ctx.valuesList().values() ) { for ( HqlParser.ValuesContext values : ctx.valuesList().values() ) {
SqmValues sqmValues = new SqmValues(); SqmValues sqmValues = new SqmValues();
for ( HqlParser.ExpressionContext expressionContext : values.expression() ) { for ( HqlParser.ExpressionContext expressionContext : values.expression() ) {
sqmValues.getExpressions().add( (SqmExpression) expressionContext.accept( this ) ); sqmValues.getExpressions().add( (SqmExpression<?>) expressionContext.accept( this ) );
} }
insertStatement.getValuesList().add( sqmValues ); insertStatement.getValuesList().add( sqmValues );
} }
@ -410,14 +409,14 @@ public SqmInsertStatement visitInsertStatement(HqlParser.InsertStatementContext
} }
@Override @Override
public SqmUpdateStatement visitUpdateStatement(HqlParser.UpdateStatementContext ctx) { public SqmUpdateStatement<R> visitUpdateStatement(HqlParser.UpdateStatementContext ctx) {
final SqmRoot<?> root = new SqmRoot<>( final SqmRoot<R> root = new SqmRoot<>(
visitEntityName( ctx.dmlTarget().entityName() ), (EntityDomainType<R>) visitEntityName( ctx.dmlTarget().entityName() ),
visitIdentificationVariableDef( ctx.dmlTarget().identificationVariableDef() ), visitIdentificationVariableDef( ctx.dmlTarget().identificationVariableDef() ),
creationContext.getNodeBuilder() creationContext.getNodeBuilder()
); );
final SqmUpdateStatement<?> updateStatement = new SqmUpdateStatement<>( root, creationContext.getNodeBuilder() ); final SqmUpdateStatement<R> updateStatement = new SqmUpdateStatement<>( root, creationContext.getNodeBuilder() );
parameterCollector = updateStatement; parameterCollector = updateStatement;
final SqmDmlCreationProcessingState processingState = new SqmDmlCreationProcessingState( final SqmDmlCreationProcessingState processingState = new SqmDmlCreationProcessingState(
updateStatement, updateStatement,
@ -430,7 +429,7 @@ public SqmUpdateStatement visitUpdateStatement(HqlParser.UpdateStatementContext
for ( HqlParser.AssignmentContext assignmentContext : ctx.setClause().assignment() ) { for ( HqlParser.AssignmentContext assignmentContext : ctx.setClause().assignment() ) {
updateStatement.applyAssignment( updateStatement.applyAssignment(
consumeDomainPath( assignmentContext.dotIdentifierSequence() ), consumeDomainPath( assignmentContext.dotIdentifierSequence() ),
(SqmExpression) assignmentContext.expression().accept( this ) (SqmExpression<?>) assignmentContext.expression().accept( this )
); );
} }
@ -444,14 +443,14 @@ public SqmUpdateStatement visitUpdateStatement(HqlParser.UpdateStatementContext
} }
@Override @Override
public SqmDeleteStatement visitDeleteStatement(HqlParser.DeleteStatementContext ctx) { public SqmDeleteStatement<R> visitDeleteStatement(HqlParser.DeleteStatementContext ctx) {
final SqmRoot<?> root = new SqmRoot<>( final SqmRoot<R> root = new SqmRoot<>(
visitEntityName( ctx.dmlTarget().entityName() ), (EntityDomainType<R>) visitEntityName( ctx.dmlTarget().entityName() ),
visitIdentificationVariableDef( ctx.dmlTarget().identificationVariableDef() ), visitIdentificationVariableDef( ctx.dmlTarget().identificationVariableDef() ),
creationContext.getNodeBuilder() creationContext.getNodeBuilder()
); );
final SqmDeleteStatement<?> deleteStatement = new SqmDeleteStatement<>( root, SqmQuerySource.HQL, creationContext.getNodeBuilder() ); final SqmDeleteStatement<R> deleteStatement = new SqmDeleteStatement<>( root, SqmQuerySource.HQL, creationContext.getNodeBuilder() );
parameterCollector = deleteStatement; parameterCollector = deleteStatement;
@ -480,14 +479,15 @@ public SqmDeleteStatement visitDeleteStatement(HqlParser.DeleteStatementContext
// Query spec // Query spec
@Override @Override
public SqmQueryPart visitSimpleQueryGroup(HqlParser.SimpleQueryGroupContext ctx) { public SqmQueryPart<Object> visitSimpleQueryGroup(HqlParser.SimpleQueryGroupContext ctx) {
return (SqmQueryPart) ctx.simpleQueryExpression().accept( this ); //noinspection unchecked
return (SqmQueryPart<Object>) ctx.simpleQueryExpression().accept( this );
} }
@Override @Override
public SqmQueryPart visitQuerySpecExpression(HqlParser.QuerySpecExpressionContext ctx) { public SqmQueryPart<Object> visitQuerySpecExpression(HqlParser.QuerySpecExpressionContext ctx) {
final List<ParseTree> children = ctx.children; final List<ParseTree> children = ctx.children;
final SqmQueryPart queryPart = visitQuerySpec( (HqlParser.QuerySpecContext) children.get( 0 ) ); final SqmQueryPart<Object> queryPart = visitQuerySpec( (HqlParser.QuerySpecContext) children.get( 0 ) );
if ( children.size() > 1 ) { if ( children.size() > 1 ) {
visitQueryOrder( queryPart, (HqlParser.QueryOrderContext) children.get( 1 ) ); visitQueryOrder( queryPart, (HqlParser.QueryOrderContext) children.get( 1 ) );
} }
@ -495,9 +495,10 @@ public SqmQueryPart visitQuerySpecExpression(HqlParser.QuerySpecExpressionContex
} }
@Override @Override
public SqmQueryPart visitNestedQueryExpression(HqlParser.NestedQueryExpressionContext ctx) { public SqmQueryPart<Object> visitNestedQueryExpression(HqlParser.NestedQueryExpressionContext ctx) {
final List<ParseTree> children = ctx.children; final List<ParseTree> children = ctx.children;
final SqmQueryPart queryPart = (SqmQueryPart) children.get( 1 ).accept( this ); //noinspection unchecked
final SqmQueryPart<Object> queryPart = (SqmQueryPart<Object>) children.get( 1 ).accept( this );
if ( children.size() > 3 ) { if ( children.size() > 3 ) {
visitQueryOrder( queryPart, (HqlParser.QueryOrderContext) children.get( 3 ) ); visitQueryOrder( queryPart, (HqlParser.QueryOrderContext) children.get( 3 ) );
} }
@ -505,17 +506,18 @@ public SqmQueryPart visitNestedQueryExpression(HqlParser.NestedQueryExpressionCo
} }
@Override @Override
public SqmQueryGroup<?> visitSetQueryGroup(HqlParser.SetQueryGroupContext ctx) { public SqmQueryGroup<Object> visitSetQueryGroup(HqlParser.SetQueryGroupContext ctx) {
if ( creationOptions.useStrictJpaCompliance() ) { if ( creationOptions.useStrictJpaCompliance() ) {
throw new StrictJpaComplianceViolation( throw new StrictJpaComplianceViolation(
StrictJpaComplianceViolation.Type.SET_OPERATIONS StrictJpaComplianceViolation.Type.SET_OPERATIONS
); );
} }
final List<ParseTree> children = ctx.children; final List<ParseTree> children = ctx.children;
final SqmQueryPart<?> firstQueryPart = (SqmQueryPart<?>) children.get( 0 ).accept( this ); //noinspection unchecked
SqmQueryGroup queryGroup; final SqmQueryPart<Object> firstQueryPart = (SqmQueryPart<Object>) children.get( 0 ).accept( this );
SqmQueryGroup<Object> queryGroup;
if ( firstQueryPart instanceof SqmQueryGroup<?>) { if ( firstQueryPart instanceof SqmQueryGroup<?>) {
queryGroup = (SqmQueryGroup<?>) firstQueryPart; queryGroup = (SqmQueryGroup<Object>) firstQueryPart;
} }
else { else {
queryGroup = new SqmQueryGroup<>( firstQueryPart ); queryGroup = new SqmQueryGroup<>( firstQueryPart );
@ -529,15 +531,15 @@ public SqmQueryGroup<?> visitSetQueryGroup(HqlParser.SetQueryGroupContext ctx) {
final SetOperator operator = visitSetOperator( (HqlParser.SetOperatorContext) children.get( i ) ); final SetOperator operator = visitSetOperator( (HqlParser.SetOperatorContext) children.get( i ) );
final HqlParser.SimpleQueryExpressionContext simpleQueryCtx = final HqlParser.SimpleQueryExpressionContext simpleQueryCtx =
(HqlParser.SimpleQueryExpressionContext) children.get( i + 1 ); (HqlParser.SimpleQueryExpressionContext) children.get( i + 1 );
final List<SqmQueryPart<?>> queryParts; final List<SqmQueryPart<Object>> queryParts;
if ( queryGroup.getSetOperator() == null || queryGroup.getSetOperator() == operator ) { if ( queryGroup.getSetOperator() == null || queryGroup.getSetOperator() == operator ) {
queryGroup.setSetOperator( operator ); queryGroup.setSetOperator( operator );
queryParts = queryGroup.getQueryParts(); queryParts = queryGroup.queryParts();
} }
else { else {
queryParts = new ArrayList<>( size - ( i >> 1 ) ); queryParts = new ArrayList<>( size - ( i >> 1 ) );
queryParts.add( queryGroup ); queryParts.add( queryGroup );
queryGroup = new SqmQueryGroup( queryGroup = new SqmQueryGroup<>(
creationContext.getNodeBuilder(), creationContext.getNodeBuilder(),
operator, operator,
queryParts queryParts
@ -545,7 +547,7 @@ public SqmQueryGroup<?> visitSetQueryGroup(HqlParser.SetQueryGroupContext ctx) {
setCurrentQueryPart( queryGroup ); setCurrentQueryPart( queryGroup );
} }
final SqmQueryPart<?> queryPart; final SqmQueryPart<Object> queryPart;
try { try {
processingStateStack.push( processingStateStack.push(
new SqmQuerySpecCreationProcessingStateStandardImpl( new SqmQuerySpecCreationProcessingStateStandardImpl(
@ -556,13 +558,13 @@ public SqmQueryGroup<?> visitSetQueryGroup(HqlParser.SetQueryGroupContext ctx) {
); );
final List<ParseTree> subChildren = simpleQueryCtx.children; final List<ParseTree> subChildren = simpleQueryCtx.children;
if ( subChildren.get( 0 ) instanceof HqlParser.QuerySpecContext ) { if ( subChildren.get( 0 ) instanceof HqlParser.QuerySpecContext ) {
final SqmQuerySpec<?> querySpec = new SqmQuerySpec<>( creationContext.getNodeBuilder() ); final SqmQuerySpec<Object> querySpec = new SqmQuerySpec<>( creationContext.getNodeBuilder() );
queryParts.add( querySpec ); queryParts.add( querySpec );
queryPart = visitQuerySpecExpression( (HqlParser.QuerySpecExpressionContext) simpleQueryCtx ); queryPart = visitQuerySpecExpression( (HqlParser.QuerySpecExpressionContext) simpleQueryCtx );
} }
else { else {
try { try {
final SqmSelectStatement selectStatement = new SqmSelectStatement( creationContext.getNodeBuilder() ); final SqmSelectStatement<Object> selectStatement = new SqmSelectStatement<>( creationContext.getNodeBuilder() );
processingStateStack.push( processingStateStack.push(
new SqmQuerySpecCreationProcessingStateStandardImpl( new SqmQuerySpecCreationProcessingStateStandardImpl(
processingStateStack.getCurrent(), processingStateStack.getCurrent(),
@ -586,7 +588,7 @@ public SqmQueryGroup<?> visitSetQueryGroup(HqlParser.SetQueryGroupContext ctx) {
throw new SemanticException( "All query parts must have the same arity!" ); throw new SemanticException( "All query parts must have the same arity!" );
} }
for ( int j = 0; j < firstSelectionSize; j++ ) { for ( int j = 0; j < firstSelectionSize; j++ ) {
final JavaTypeDescriptor firstJavaTypeDescriptor = firstSelections.get( j ).getNodeJavaTypeDescriptor(); final JavaTypeDescriptor<?> firstJavaTypeDescriptor = firstSelections.get( j ).getNodeJavaTypeDescriptor();
if ( firstJavaTypeDescriptor != selections.get( j ).getNodeJavaTypeDescriptor() ) { if ( firstJavaTypeDescriptor != selections.get( j ).getNodeJavaTypeDescriptor() ) {
throw new SemanticException( throw new SemanticException(
"Select items of the same index must have the same java type across all query parts!" "Select items of the same index must have the same java type across all query parts!"
@ -664,8 +666,9 @@ else if ( fetchClauseContext == null ) {
} }
@Override @Override
public SqmQuerySpec<?> visitQuerySpec(HqlParser.QuerySpecContext ctx) { public SqmQuerySpec<Object> visitQuerySpec(HqlParser.QuerySpecContext ctx) {
final SqmQuerySpec<?> sqmQuerySpec = currentQuerySpec(); //noinspection unchecked
final SqmQuerySpec<Object> sqmQuerySpec = (SqmQuerySpec<Object>) currentQuerySpec();
// visit from-clause first!!! // visit from-clause first!!!
treatHandlerStack.push( new TreatHandlerFromClause() ); treatHandlerStack.push( new TreatHandlerFromClause() );
@ -2848,7 +2851,6 @@ private SqmLiteral<BigDecimal> bigDecimalLiteral(String text) {
} }
private <J> BasicDomainType<J> resolveExpressableTypeBasic(Class<J> javaType) { private <J> BasicDomainType<J> resolveExpressableTypeBasic(Class<J> javaType) {
//noinspection unchecked
return creationContext.getJpaMetamodel().getTypeConfiguration().standardBasicTypeForJavaType( javaType ); return creationContext.getJpaMetamodel().getTypeConfiguration().standardBasicTypeForJavaType( javaType );
} }

View File

@ -70,14 +70,14 @@ public StandardHqlTranslator(
} }
@Override @Override
public SqmStatement translate(String query) { public <R> SqmStatement<R> translate(String query) {
HqlLogging.QUERY_LOGGER.debugf( "HQL : " + query ); HqlLogging.QUERY_LOGGER.debugf( "HQL : " + query );
final HqlParser.StatementContext hqlParseTree = parseHql( query ); final HqlParser.StatementContext hqlParseTree = parseHql( query );
// then we perform semantic analysis and build the semantic representation... // then we perform semantic analysis and build the semantic representation...
try { try {
final SqmStatement sqmStatement = SemanticQueryBuilder.buildSemanticModel( final SqmStatement<R> sqmStatement = SemanticQueryBuilder.buildSemanticModel(
hqlParseTree, hqlParseTree,
sqmCreationOptions, sqmCreationOptions,
sqmCreationContext sqmCreationContext

View File

@ -21,5 +21,5 @@ public interface HqlQueryImplementor<R> extends QueryImplementor<R>, NameableQue
@Override @Override
ParameterMetadataImplementor getParameterMetadata(); ParameterMetadataImplementor getParameterMetadata();
SqmStatement getSqmStatement(); SqmStatement<R> getSqmStatement();
} }

View File

@ -132,7 +132,7 @@ private RowTransformer<R> determineRowTransformer(
// NOTE : if we get here, a result-type of some kind (other than Object[].class) was specified // NOTE : if we get here, a result-type of some kind (other than Object[].class) was specified
final List<SqmSelection> selections = sqm.getQuerySpec().getSelectClause().getSelections(); final List<SqmSelection> selections = sqm.getQueryPart().getFirstQuerySpec().getSelectClause().getSelections();
if ( Tuple.class.isAssignableFrom( resultType ) ) { if ( Tuple.class.isAssignableFrom( resultType ) ) {
// resultType is Tuple.. // resultType is Tuple..
if ( queryOptions.getTupleTransformer() == null ) { if ( queryOptions.getTupleTransformer() == null ) {

View File

@ -17,14 +17,11 @@
import javax.persistence.PersistenceException; import javax.persistence.PersistenceException;
import javax.persistence.Tuple; import javax.persistence.Tuple;
import org.hibernate.AssertionFailure;
import org.hibernate.HibernateException; import org.hibernate.HibernateException;
import org.hibernate.LockMode; import org.hibernate.LockMode;
import org.hibernate.ScrollMode; import org.hibernate.ScrollMode;
import org.hibernate.cfg.NotYetImplementedException; import org.hibernate.cfg.NotYetImplementedException;
import org.hibernate.engine.query.spi.EntityGraphQueryHint; import org.hibernate.engine.query.spi.EntityGraphQueryHint;
import org.hibernate.engine.spi.QueryParameters;
import org.hibernate.engine.spi.RowSelection;
import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.graph.GraphSemantic; import org.hibernate.graph.GraphSemantic;
@ -48,7 +45,6 @@
import org.hibernate.query.spi.MutableQueryOptions; import org.hibernate.query.spi.MutableQueryOptions;
import org.hibernate.query.spi.NonSelectQueryPlan; import org.hibernate.query.spi.NonSelectQueryPlan;
import org.hibernate.query.spi.ParameterMetadataImplementor; import org.hibernate.query.spi.ParameterMetadataImplementor;
import org.hibernate.query.spi.QueryImplementor;
import org.hibernate.query.spi.QueryInterpretationCache; import org.hibernate.query.spi.QueryInterpretationCache;
import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryOptions;
import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.query.spi.QueryParameterBindings;
@ -66,6 +62,8 @@
import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.query.sqm.tree.from.SqmRoot; import org.hibernate.query.sqm.tree.from.SqmRoot;
import org.hibernate.query.sqm.tree.insert.SqmInsertStatement; import org.hibernate.query.sqm.tree.insert.SqmInsertStatement;
import org.hibernate.query.sqm.tree.select.SqmQueryGroup;
import org.hibernate.query.sqm.tree.select.SqmQueryPart;
import org.hibernate.query.sqm.tree.select.SqmQuerySpec; import org.hibernate.query.sqm.tree.select.SqmQuerySpec;
import org.hibernate.query.sqm.tree.select.SqmSelectStatement; import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
import org.hibernate.query.sqm.tree.select.SqmSelection; import org.hibernate.query.sqm.tree.select.SqmSelection;
@ -90,8 +88,8 @@ public class QuerySqmImpl<R>
private static final CoreMessageLogger LOG = CoreLogging.messageLogger( QuerySqmImpl.class ); private static final CoreMessageLogger LOG = CoreLogging.messageLogger( QuerySqmImpl.class );
private final String hqlString; private final String hqlString;
private final SqmStatement sqmStatement; private final SqmStatement<R> sqmStatement;
private final Class resultType; private final Class<R> resultType;
private final ParameterMetadataImplementor parameterMetadata; private final ParameterMetadataImplementor parameterMetadata;
private final DomainParameterXref domainParameterXref; private final DomainParameterXref domainParameterXref;
@ -168,7 +166,7 @@ protected void applyOptions(NamedHqlQueryMemento memento) {
public QuerySqmImpl( public QuerySqmImpl(
String hqlString, String hqlString,
HqlInterpretation hqlInterpretation, HqlInterpretation hqlInterpretation,
Class resultType, Class<R> resultType,
SharedSessionContractImplementor producer) { SharedSessionContractImplementor producer) {
super( producer ); super( producer );
@ -179,8 +177,11 @@ public QuerySqmImpl(
if ( resultType != null ) { if ( resultType != null ) {
SqmUtil.verifyIsSelectStatement( sqmStatement ); SqmUtil.verifyIsSelectStatement( sqmStatement );
//noinspection unchecked visitQueryReturnType(
checkQueryReturnType( (SqmSelectStatement<R>) sqmStatement, resultType, producer.getFactory() ); ( (SqmSelectStatement<R>) sqmStatement ).getQueryPart(),
resultType,
producer.getFactory()
);
} }
this.parameterMetadata = hqlInterpretation.getParameterMetadata(); this.parameterMetadata = hqlInterpretation.getParameterMetadata();
@ -193,36 +194,17 @@ public QuerySqmImpl(
* Form used for criteria queries * Form used for criteria queries
*/ */
public QuerySqmImpl( public QuerySqmImpl(
SqmStatement sqmStatement, SqmStatement<R> sqmStatement,
Class resultType, Class<R> resultType,
SharedSessionContractImplementor producer) { SharedSessionContractImplementor producer) {
super( producer ); super( producer );
if ( sqmStatement instanceof SqmSelectStatement ) { if ( sqmStatement instanceof SqmSelectStatement ) {
final SqmSelectStatement sqmSelectStatement = (SqmSelectStatement) sqmStatement; visitQueryReturnType(
final SqmQuerySpec sqmQuerySpec = sqmSelectStatement.getQuerySpec(); ( (SqmSelectStatement<R>) sqmStatement ).getQueryPart(),
final List<SqmSelection> sqmSelections = sqmQuerySpec.getSelectClause().getSelections(); resultType,
producer.getFactory()
// make sure there is at least one root );
final List<SqmRoot<?>> sqmRoots = sqmQuerySpec.getFromClause().getRoots();
if ( sqmRoots == null || sqmRoots.isEmpty() ) {
throw new IllegalArgumentException( "Criteria did not define any query roots" );
}
if ( sqmSelections == null || sqmSelections.isEmpty() ) {
// if there is a single root, use that as the selection
if ( sqmRoots.size() == 1 ) {
final SqmRoot<?> sqmRoot = sqmRoots.get( 0 );
sqmQuerySpec.getSelectClause().add( sqmRoot, null );
}
else {
throw new IllegalArgumentException( );
}
}
if ( resultType != null ) {
checkQueryReturnType( (SqmSelectStatement<R>) sqmStatement, resultType, producer.getFactory() );
}
} }
else { else {
assert sqmStatement instanceof SqmDmlStatement; assert sqmStatement instanceof SqmDmlStatement;
@ -255,13 +237,50 @@ public QuerySqmImpl(
} }
} }
private static <T> void checkQueryReturnType(SqmSelectStatement<T> sqm, Class<T> resultClass, SessionFactoryImplementor sessionFactory) { private void visitQueryReturnType(
SqmQueryPart<R> queryPart,
Class<R> resultType,
SessionFactoryImplementor factory) {
if ( queryPart instanceof SqmQuerySpec<?> ) {
final SqmQuerySpec<R> sqmQuerySpec = (SqmQuerySpec<R>) queryPart;
final List<SqmSelection> sqmSelections = sqmQuerySpec.getSelectClause().getSelections();
// make sure there is at least one root
final List<SqmRoot<?>> sqmRoots = sqmQuerySpec.getFromClause().getRoots();
if ( sqmRoots == null || sqmRoots.isEmpty() ) {
throw new IllegalArgumentException( "Criteria did not define any query roots" );
}
if ( sqmSelections == null || sqmSelections.isEmpty() ) {
// if there is a single root, use that as the selection
if ( sqmRoots.size() == 1 ) {
final SqmRoot<?> sqmRoot = sqmRoots.get( 0 );
sqmQuerySpec.getSelectClause().add( sqmRoot, null );
}
else {
throw new IllegalArgumentException( );
}
}
if ( resultType != null ) {
checkQueryReturnType( sqmQuerySpec, resultType, factory );
}
}
else {
final SqmQueryGroup<R> queryGroup = (SqmQueryGroup<R>) queryPart;
for ( SqmQueryPart<R> sqmQueryPart : queryGroup.getQueryParts() ) {
visitQueryReturnType( sqmQueryPart, resultType, factory );
}
}
}
private static <T> void checkQueryReturnType(SqmQuerySpec<T> querySpec, Class<T> resultClass, SessionFactoryImplementor sessionFactory) {
if ( resultClass == null ) { if ( resultClass == null ) {
// nothing to check // nothing to check
return; return;
} }
final List<SqmSelection> selections = sqm.getQuerySpec().getSelectClause().getSelections(); final List<SqmSelection> selections = querySpec.getSelectClause().getSelections();
if ( resultClass.isArray() ) { if ( resultClass.isArray() ) {
// todo (6.0) : implement // todo (6.0) : implement
@ -356,7 +375,7 @@ protected void applyEntityGraphQueryHint(String hintName, RootGraphImplementor e
} }
@Override @Override
public SqmStatement getSqmStatement() { public SqmStatement<R> getSqmStatement() {
return sqmStatement; return sqmStatement;
} }
@ -465,13 +484,13 @@ protected List<R> doList() {
SqmUtil.verifyIsSelectStatement( getSqmStatement() ); SqmUtil.verifyIsSelectStatement( getSqmStatement() );
getSession().prepareForQueryExecution( requiresTxn( getLockOptions().findGreatestLockMode() ) ); getSession().prepareForQueryExecution( requiresTxn( getLockOptions().findGreatestLockMode() ) );
final SqmSelectStatement<?> selectStatement = (SqmSelectStatement<?>) getSqmStatement(); final SqmSelectStatement<?> selectStatement = (SqmSelectStatement<?>) getSqmStatement();
final boolean containsCollectionFetches = selectStatement.getQuerySpec().containsCollectionFetches(); final boolean containsCollectionFetches = selectStatement.containsCollectionFetches();
final boolean hasLimit = queryOptions.hasLimit(); final boolean hasLimit = queryOptions.hasLimit();
final boolean needsDistincting = ( final boolean needsDistincting = containsCollectionFetches && (
selectStatement.getQuerySpec().getSelectClause().isDistinct() || selectStatement.usesDistinct() ||
queryOptions.getGraph() != null || queryOptions.getGraph() != null ||
hasLimit ) hasLimit
&& containsCollectionFetches; );
ExecutionContext executionContextToUse; ExecutionContext executionContextToUse;
if ( queryOptions.hasLimit() && containsCollectionFetches ) { if ( queryOptions.hasLimit() && containsCollectionFetches ) {
boolean fail = getSessionFactory().getSessionFactoryOptions().isFailOnPaginationOverCollectionFetchEnabled(); boolean fail = getSessionFactory().getSessionFactoryOptions().isFailOnPaginationOverCollectionFetchEnabled();
@ -548,8 +567,8 @@ private SelectQueryPlan<R> resolveSelectQueryPlan() {
} }
private SelectQueryPlan<R> buildSelectQueryPlan() { private SelectQueryPlan<R> buildSelectQueryPlan() {
final SqmSelectStatement[] concreteSqmStatements = QuerySplitter.split( final SqmSelectStatement<R>[] concreteSqmStatements = QuerySplitter.split(
(SqmSelectStatement) getSqmStatement(), (SqmSelectStatement<R>) getSqmStatement(),
getSessionFactory() getSessionFactory()
); );
@ -566,8 +585,8 @@ private SelectQueryPlan<R> buildSelectQueryPlan() {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private SelectQueryPlan<R> buildAggregatedSelectQueryPlan(SqmSelectStatement[] concreteSqmStatements) { private SelectQueryPlan<R> buildAggregatedSelectQueryPlan(SqmSelectStatement<R>[] concreteSqmStatements) {
final SelectQueryPlan[] aggregatedQueryPlans = new SelectQueryPlan[ concreteSqmStatements.length ]; final SelectQueryPlan<R>[] aggregatedQueryPlans = new SelectQueryPlan[ concreteSqmStatements.length ];
// todo (6.0) : we want to make sure that certain thing (ResultListTransformer, etc) only get applied at the aggregator-level // todo (6.0) : we want to make sure that certain thing (ResultListTransformer, etc) only get applied at the aggregator-level
@ -583,7 +602,7 @@ private SelectQueryPlan<R> buildAggregatedSelectQueryPlan(SqmSelectStatement[] c
} }
private SelectQueryPlan<R> buildConcreteSelectQueryPlan( private SelectQueryPlan<R> buildConcreteSelectQueryPlan(
SqmSelectStatement concreteSqmStatement, SqmSelectStatement<R> concreteSqmStatement,
Class<R> resultType, Class<R> resultType,
QueryOptions queryOptions) { QueryOptions queryOptions) {
return new ConcreteSqmSelectQueryPlan<>( return new ConcreteSqmSelectQueryPlan<>(
@ -633,15 +652,15 @@ private NonSelectQueryPlan resolveNonSelectQueryPlan() {
private NonSelectQueryPlan buildNonSelectQueryPlan() { private NonSelectQueryPlan buildNonSelectQueryPlan() {
// to get here the SQM statement has already been validated to be // to get here the SQM statement has already been validated to be
// a non-select variety... // a non-select variety...
if ( getSqmStatement() instanceof SqmDeleteStatement ) { if ( getSqmStatement() instanceof SqmDeleteStatement<?> ) {
return buildDeleteQueryPlan(); return buildDeleteQueryPlan();
} }
if ( getSqmStatement() instanceof SqmUpdateStatement ) { if ( getSqmStatement() instanceof SqmUpdateStatement<?> ) {
return buildUpdateQueryPlan(); return buildUpdateQueryPlan();
} }
if ( getSqmStatement() instanceof SqmInsertStatement ) { if ( getSqmStatement() instanceof SqmInsertStatement<?> ) {
return buildInsertQueryPlan(); return buildInsertQueryPlan();
} }
@ -649,7 +668,7 @@ private NonSelectQueryPlan buildNonSelectQueryPlan() {
} }
private NonSelectQueryPlan buildDeleteQueryPlan() { private NonSelectQueryPlan buildDeleteQueryPlan() {
final SqmDeleteStatement sqmDelete = (SqmDeleteStatement) getSqmStatement(); final SqmDeleteStatement<R> sqmDelete = (SqmDeleteStatement<R>) getSqmStatement();
final String entityNameToDelete = sqmDelete.getTarget().getReferencedPathSource().getHibernateEntityName(); final String entityNameToDelete = sqmDelete.getTarget().getReferencedPathSource().getHibernateEntityName();
final EntityPersister entityDescriptor = getSessionFactory().getDomainModel().findEntityDescriptor( entityNameToDelete ); final EntityPersister entityDescriptor = getSessionFactory().getDomainModel().findEntityDescriptor( entityNameToDelete );
@ -664,7 +683,7 @@ private NonSelectQueryPlan buildDeleteQueryPlan() {
} }
private NonSelectQueryPlan buildUpdateQueryPlan() { private NonSelectQueryPlan buildUpdateQueryPlan() {
final SqmUpdateStatement sqmUpdate = (SqmUpdateStatement) getSqmStatement(); final SqmUpdateStatement<R> sqmUpdate = (SqmUpdateStatement<R>) getSqmStatement();
final String entityNameToUpdate = sqmUpdate.getTarget().getReferencedPathSource().getHibernateEntityName(); final String entityNameToUpdate = sqmUpdate.getTarget().getReferencedPathSource().getHibernateEntityName();
final EntityPersister entityDescriptor = getSessionFactory().getDomainModel().findEntityDescriptor( entityNameToUpdate ); final EntityPersister entityDescriptor = getSessionFactory().getDomainModel().findEntityDescriptor( entityNameToUpdate );
@ -679,7 +698,7 @@ private NonSelectQueryPlan buildUpdateQueryPlan() {
} }
private NonSelectQueryPlan buildInsertQueryPlan() { private NonSelectQueryPlan buildInsertQueryPlan() {
final SqmInsertStatement sqmInsert = (SqmInsertStatement) getSqmStatement(); final SqmInsertStatement<R> sqmInsert = (SqmInsertStatement<R>) getSqmStatement();
// final String entityNameToUpdate = sqmInsert.getTarget().getReferencedPathSource().getHibernateEntityName(); // final String entityNameToUpdate = sqmInsert.getTarget().getReferencedPathSource().getHibernateEntityName();
// final EntityPersister entityDescriptor = getSessionFactory().getDomainModel().findEntityDescriptor( entityNameToUpdate ); // final EntityPersister entityDescriptor = getSessionFactory().getDomainModel().findEntityDescriptor( entityNameToUpdate );

View File

@ -13,6 +13,7 @@
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -21,6 +22,7 @@
import java.util.function.Supplier; import java.util.function.Supplier;
import javax.persistence.Tuple; import javax.persistence.Tuple;
import javax.persistence.criteria.CollectionJoin; import javax.persistence.criteria.CollectionJoin;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression; import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join; import javax.persistence.criteria.Join;
import javax.persistence.criteria.ListJoin; import javax.persistence.criteria.ListJoin;
@ -35,6 +37,7 @@
import org.hibernate.NotYetImplementedFor6Exception; import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.NullPrecedence; import org.hibernate.NullPrecedence;
import org.hibernate.QueryException; import org.hibernate.QueryException;
import org.hibernate.SetOperator;
import org.hibernate.SortOrder; import org.hibernate.SortOrder;
import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.util.collections.ArrayHelper; import org.hibernate.internal.util.collections.ArrayHelper;
@ -50,13 +53,17 @@
import org.hibernate.query.UnaryArithmeticOperator; import org.hibernate.query.UnaryArithmeticOperator;
import org.hibernate.query.criteria.JpaCoalesce; import org.hibernate.query.criteria.JpaCoalesce;
import org.hibernate.query.criteria.JpaCompoundSelection; import org.hibernate.query.criteria.JpaCompoundSelection;
import org.hibernate.query.criteria.JpaCriteriaQuery;
import org.hibernate.query.criteria.JpaExpression; import org.hibernate.query.criteria.JpaExpression;
import org.hibernate.query.criteria.JpaQueryGroup;
import org.hibernate.query.criteria.JpaQueryPart;
import org.hibernate.query.criteria.JpaSelection; import org.hibernate.query.criteria.JpaSelection;
import org.hibernate.query.criteria.LiteralHandlingMode; import org.hibernate.query.criteria.LiteralHandlingMode;
import org.hibernate.query.criteria.ValueHandlingMode; import org.hibernate.query.criteria.ValueHandlingMode;
import org.hibernate.query.internal.QueryHelper; import org.hibernate.query.internal.QueryHelper;
import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SqmExpressable;
import org.hibernate.query.sqm.SqmQuerySource; import org.hibernate.query.sqm.SqmQuerySource;
import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.query.sqm.function.SqmFunctionDescriptor;
import org.hibernate.query.sqm.spi.SqmCreationContext; import org.hibernate.query.sqm.spi.SqmCreationContext;
@ -100,6 +107,9 @@
import org.hibernate.query.sqm.tree.select.SqmDynamicInstantiation; import org.hibernate.query.sqm.tree.select.SqmDynamicInstantiation;
import org.hibernate.query.sqm.tree.select.SqmDynamicInstantiationArgument; import org.hibernate.query.sqm.tree.select.SqmDynamicInstantiationArgument;
import org.hibernate.query.sqm.tree.select.SqmJpaCompoundSelection; import org.hibernate.query.sqm.tree.select.SqmJpaCompoundSelection;
import org.hibernate.query.sqm.tree.select.SqmQueryGroup;
import org.hibernate.query.sqm.tree.select.SqmQueryPart;
import org.hibernate.query.sqm.tree.select.SqmSelectQuery;
import org.hibernate.query.sqm.tree.select.SqmSelectStatement; import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
import org.hibernate.query.sqm.tree.select.SqmSelectableNode; import org.hibernate.query.sqm.tree.select.SqmSelectableNode;
import org.hibernate.query.sqm.tree.select.SqmSortSpecification; import org.hibernate.query.sqm.tree.select.SqmSortSpecification;
@ -203,11 +213,46 @@ public <T> SqmInsertSelectStatement<T> createCriteriaInsertSelect(Class<T> targe
} }
@Override @Override
public <X, T> SqmExpression<X> cast(JpaExpression<T> expression, Class<X> castTargetJavaType) { public <T> JpaCriteriaQuery<T> union(boolean all, CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries) {
final BasicDomainType type = getTypeConfiguration().standardBasicTypeForJavaType( castTargetJavaType ); return setOperation( all ? SetOperator.UNION_ALL : SetOperator.UNION, query1, queries );
//noinspection unchecked }
@Override
public <T> JpaCriteriaQuery<T> intersect(boolean all, CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries) {
return setOperation( all ? SetOperator.INTERSECT_ALL : SetOperator.INTERSECT, query1, queries );
}
@Override
public <T> JpaCriteriaQuery<T> except(boolean all, CriteriaQuery<? extends T> query1, CriteriaQuery<?>... queries) {
return setOperation( all ? SetOperator.EXCEPT_ALL : SetOperator.EXCEPT, query1, queries );
}
private <T> JpaCriteriaQuery<T> setOperation(
SetOperator operator,
CriteriaQuery<? extends T> query1,
CriteriaQuery<?>... queries) {
final Class<T> resultType = (Class<T>) query1.getResultType();
final List<SqmQueryPart<T>> queryParts = new ArrayList<>( queries.length + 1 );
queryParts.add( ( (SqmSelectQuery<T>) query1 ).getQueryPart() );
for ( CriteriaQuery<?> query : queries ) {
if ( query.getResultType() != resultType ) {
throw new IllegalArgumentException( "Result type of all operands must match!" );
}
queryParts.add( ( (SqmSelectQuery<T>) query ).getQueryPart() );
}
return new SqmSelectStatement<>(
new SqmQueryGroup<>( this, operator, queryParts ),
resultType,
SqmQuerySource.CRITERIA,
this
);
}
@Override
public <X, T> SqmExpression<X> cast(JpaExpression<T> expression, Class<X> castTargetJavaType) {
final BasicDomainType<X> type = getTypeConfiguration().standardBasicTypeForJavaType( castTargetJavaType );
return getFunctionDescriptor("cast").generateSqmExpression( return getFunctionDescriptor("cast").generateSqmExpression(
asList( (SqmTypedNode) expression, new SqmCastTarget<>( type, this ) ), asList( (SqmTypedNode<?>) expression, new SqmCastTarget<>( type, this ) ),
type, type,
queryEngine, queryEngine,
getJpaMetamodel().getTypeConfiguration() getJpaMetamodel().getTypeConfiguration()
@ -318,22 +363,23 @@ else if ( Map.class.equals( resultClass ) ) {
@Override @Override
public <Y> JpaCompoundSelection<Y> construct(Class<Y> resultClass, List<? extends JpaSelection<?>> arguments) { public <Y> JpaCompoundSelection<Y> construct(Class<Y> resultClass, List<? extends JpaSelection<?>> arguments) {
final SqmDynamicInstantiation instantiation; final SqmDynamicInstantiation<Y> instantiation;
if ( List.class.equals( resultClass ) ) { if ( List.class.equals( resultClass ) ) {
instantiation = SqmDynamicInstantiation.forListInstantiation( this ); //noinspection unchecked
instantiation = (SqmDynamicInstantiation<Y>) SqmDynamicInstantiation.forListInstantiation( this );
} }
else if ( Map.class.equals( resultClass ) ) { else if ( Map.class.equals( resultClass ) ) {
instantiation = SqmDynamicInstantiation.forMapInstantiation( this ); //noinspection unchecked
instantiation = (SqmDynamicInstantiation<Y>) SqmDynamicInstantiation.forMapInstantiation( this );
} }
else { else {
instantiation = SqmDynamicInstantiation.forClassInstantiation( resultClass, this ); instantiation = SqmDynamicInstantiation.forClassInstantiation( resultClass, this );
} }
for ( Selection<?> argument : arguments ) { for ( Selection<?> argument : arguments ) {
//noinspection unchecked
instantiation.addArgument( instantiation.addArgument(
new SqmDynamicInstantiationArgument( new SqmDynamicInstantiationArgument<>(
(SqmSelectableNode) argument, (SqmSelectableNode<?>) argument,
argument.getAlias(), argument.getAlias(),
this this
) )
@ -348,33 +394,32 @@ else if ( Map.class.equals( resultClass ) ) {
@Override @Override
public SqmSortSpecification sort(JpaExpression<?> sortExpression, SortOrder sortOrder, NullPrecedence nullPrecedence) { public SqmSortSpecification sort(JpaExpression<?> sortExpression, SortOrder sortOrder, NullPrecedence nullPrecedence) {
return new SqmSortSpecification( (SqmExpression) sortExpression, sortOrder, nullPrecedence ); return new SqmSortSpecification( (SqmExpression<?>) sortExpression, sortOrder, nullPrecedence );
} }
@Override @Override
public SqmSortSpecification sort(JpaExpression<?> sortExpression, SortOrder sortOrder) { public SqmSortSpecification sort(JpaExpression<?> sortExpression, SortOrder sortOrder) {
return new SqmSortSpecification( (SqmExpression) sortExpression, sortOrder ); return new SqmSortSpecification( (SqmExpression<?>) sortExpression, sortOrder );
} }
@Override @Override
public SqmSortSpecification sort(JpaExpression<?> sortExpression) { public SqmSortSpecification sort(JpaExpression<?> sortExpression) {
return new SqmSortSpecification( (SqmExpression) sortExpression ); return new SqmSortSpecification( (SqmExpression<?>) sortExpression );
} }
@Override @Override
public SqmSortSpecification asc(Expression<?> x) { public SqmSortSpecification asc(Expression<?> x) {
return new SqmSortSpecification( (SqmExpression) x, SortOrder.ASCENDING ); return new SqmSortSpecification( (SqmExpression<?>) x, SortOrder.ASCENDING );
} }
@Override @Override
public SqmSortSpecification desc(Expression<?> x) { public SqmSortSpecification desc(Expression<?> x) {
return new SqmSortSpecification( (SqmExpression) x, SortOrder.DESCENDING ); return new SqmSortSpecification( (SqmExpression<?>) x, SortOrder.DESCENDING );
} }
@Override @Override
public JpaCompoundSelection<Tuple> tuple(Selection<?>[] selections) { public JpaCompoundSelection<Tuple> tuple(Selection<?>[] selections) {
//noinspection unchecked return new SqmJpaCompoundSelection<>(
return new SqmJpaCompoundSelection(
ArrayHelper.toList( selections ), ArrayHelper.toList( selections ),
getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Tuple.class ), getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Tuple.class ),
this this
@ -384,8 +429,8 @@ public JpaCompoundSelection<Tuple> tuple(Selection<?>[] selections) {
@Override @Override
public JpaCompoundSelection<Tuple> tuple(List<? extends JpaSelection<?>> selections) { public JpaCompoundSelection<Tuple> tuple(List<? extends JpaSelection<?>> selections) {
//noinspection unchecked //noinspection unchecked
return new SqmJpaCompoundSelection( return new SqmJpaCompoundSelection<>(
selections, (List<SqmSelectableNode<?>>) selections,
getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Tuple.class ), getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Tuple.class ),
this this
); );
@ -395,7 +440,7 @@ public JpaCompoundSelection<Tuple> tuple(List<? extends JpaSelection<?>> selecti
public <R> SqmTuple<R> tuple(Class<R> tupleType, JpaExpression<?>... expressions) { public <R> SqmTuple<R> tuple(Class<R> tupleType, JpaExpression<?>... expressions) {
//noinspection unchecked //noinspection unchecked
return new SqmTuple<>( return new SqmTuple<>(
(List) asList( expressions ), (List<SqmExpression<?>>) (List<?>) asList( expressions ),
// getTypeConfiguration().standardExpressableTypeForJavaType( tupleType ), // getTypeConfiguration().standardExpressableTypeForJavaType( tupleType ),
this this
); );
@ -405,7 +450,7 @@ public <R> SqmTuple<R> tuple(Class<R> tupleType, JpaExpression<?>... expressions
public <R> SqmTuple<R> tuple(Class<R> tupleType, List<JpaExpression<?>> expressions) { public <R> SqmTuple<R> tuple(Class<R> tupleType, List<JpaExpression<?>> expressions) {
//noinspection unchecked //noinspection unchecked
return new SqmTuple<>( return new SqmTuple<>(
(List) expressions, (List<SqmExpression<?>>) (List<?>) expressions,
// getTypeConfiguration().standardExpressableTypeForJavaType( tupleType ), // getTypeConfiguration().standardExpressableTypeForJavaType( tupleType ),
this this
); );
@ -415,18 +460,17 @@ public <R> SqmTuple<R> tuple(Class<R> tupleType, List<JpaExpression<?>> expressi
public <R> SqmTuple<R> tuple(DomainType<R> tupleType, JpaExpression<?>... expressions) { public <R> SqmTuple<R> tuple(DomainType<R> tupleType, JpaExpression<?>... expressions) {
//noinspection unchecked //noinspection unchecked
return new SqmTuple<>( return new SqmTuple<>(
(List) asList( expressions ), (List<SqmExpression<?>>) (List<?>) asList( expressions ),
tupleType, tupleType,
this this
); );
} }
@Override @Override
public <R> SqmTuple<R> tuple( public <R> SqmTuple<R> tuple(DomainType<R> tupleType, List<JpaExpression<?>> expressions) {
DomainType<R> tupleType, List<JpaExpression<?>> expressions) {
//noinspection unchecked //noinspection unchecked
return new SqmTuple<>( return new SqmTuple<>(
new ArrayList<>((List) expressions), new ArrayList<>( (List<SqmExpression<?>>) (List<?>) expressions ),
tupleType, tupleType,
this this
); );
@ -434,8 +478,7 @@ public <R> SqmTuple<R> tuple(
@Override @Override
public JpaCompoundSelection<Object[]> array(Selection<?>[] selections) { public JpaCompoundSelection<Object[]> array(Selection<?>[] selections) {
//noinspection unchecked return new SqmJpaCompoundSelection<>(
return new SqmJpaCompoundSelection(
ArrayHelper.toList( selections ), ArrayHelper.toList( selections ),
getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Object[].class ), getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Object[].class ),
this this
@ -445,8 +488,8 @@ public JpaCompoundSelection<Object[]> array(Selection<?>[] selections) {
@Override @Override
public JpaCompoundSelection<Object[]> array(List<? extends JpaSelection<?>> selections) { public JpaCompoundSelection<Object[]> array(List<? extends JpaSelection<?>> selections) {
//noinspection unchecked //noinspection unchecked
return new SqmJpaCompoundSelection( return new SqmJpaCompoundSelection<>(
selections, (List<SqmSelectableNode<?>>) selections,
getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Object[].class ), getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Object[].class ),
this this
); );
@ -455,7 +498,7 @@ public JpaCompoundSelection<Object[]> array(List<? extends JpaSelection<?>> sele
@Override @Override
public <N extends Number> SqmExpression<Double> avg(Expression<N> argument) { public <N extends Number> SqmExpression<Double> avg(Expression<N> argument) {
return getFunctionDescriptor("avg").generateSqmExpression( return getFunctionDescriptor("avg").generateSqmExpression(
(SqmTypedNode) argument, (SqmTypedNode<?>) argument,
StandardBasicTypes.DOUBLE, StandardBasicTypes.DOUBLE,
queryEngine, queryEngine,
getJpaMetamodel().getTypeConfiguration() getJpaMetamodel().getTypeConfiguration()
@ -465,7 +508,7 @@ public <N extends Number> SqmExpression<Double> avg(Expression<N> argument) {
@Override @Override
public <N extends Number> SqmExpression<N> sum(Expression<N> argument) { public <N extends Number> SqmExpression<N> sum(Expression<N> argument) {
return getFunctionDescriptor("sum").generateSqmExpression( return getFunctionDescriptor("sum").generateSqmExpression(
(SqmTypedNode) argument, (SqmTypedNode<?>) argument,
(AllowableFunctionReturnType<N>) ( (SqmExpression<N>) argument ).getNodeType(), (AllowableFunctionReturnType<N>) ( (SqmExpression<N>) argument ).getNodeType(),
queryEngine, queryEngine,
getJpaMetamodel().getTypeConfiguration() getJpaMetamodel().getTypeConfiguration()
@ -484,9 +527,8 @@ public SqmExpression<Double> sumAsDouble(Expression<Float> argument) {
@Override @Override
public <N extends Number> SqmExpression<N> max(Expression<N> argument) { public <N extends Number> SqmExpression<N> max(Expression<N> argument) {
//noinspection unchecked
return getFunctionDescriptor("max").generateSqmExpression( return getFunctionDescriptor("max").generateSqmExpression(
(SqmTypedNode) argument, (SqmTypedNode<?>) argument,
(AllowableFunctionReturnType<N>) ((SqmExpression<N>) argument).getNodeType(), (AllowableFunctionReturnType<N>) ((SqmExpression<N>) argument).getNodeType(),
queryEngine, queryEngine,
getJpaMetamodel().getTypeConfiguration() getJpaMetamodel().getTypeConfiguration()
@ -495,9 +537,8 @@ public <N extends Number> SqmExpression<N> max(Expression<N> argument) {
@Override @Override
public <N extends Number> SqmExpression<N> min(Expression<N> argument) { public <N extends Number> SqmExpression<N> min(Expression<N> argument) {
//noinspection unchecked
return getFunctionDescriptor("min").generateSqmExpression( return getFunctionDescriptor("min").generateSqmExpression(
(SqmTypedNode) argument, (SqmTypedNode<?>) argument,
(AllowableFunctionReturnType<N>) ((SqmExpression<N>) argument).getNodeType(), (AllowableFunctionReturnType<N>) ((SqmExpression<N>) argument).getNodeType(),
queryEngine, queryEngine,
getJpaMetamodel().getTypeConfiguration() getJpaMetamodel().getTypeConfiguration()
@ -516,9 +557,8 @@ public <X extends Comparable<? super X>> SqmExpression<X> least(Expression<X> ar
@Override @Override
public SqmExpression<Long> count(Expression<?> argument) { public SqmExpression<Long> count(Expression<?> argument) {
//noinspection unchecked
return getFunctionDescriptor("count").generateSqmExpression( return getFunctionDescriptor("count").generateSqmExpression(
(SqmTypedNode) argument, (SqmTypedNode<?>) argument,
StandardBasicTypes.LONG, StandardBasicTypes.LONG,
queryEngine, queryEngine,
getJpaMetamodel().getTypeConfiguration() getJpaMetamodel().getTypeConfiguration()
@ -546,9 +586,8 @@ public <N extends Number> SqmExpression<N> neg(Expression<N> x) {
@Override @Override
public <N extends Number> SqmExpression<N> abs(Expression<N> x) { public <N extends Number> SqmExpression<N> abs(Expression<N> x) {
//noinspection unchecked
return getFunctionDescriptor("abs").generateSqmExpression( return getFunctionDescriptor("abs").generateSqmExpression(
(SqmTypedNode) x, (SqmTypedNode<?>) x,
(AllowableFunctionReturnType<N>) ((SqmExpression<N>) x).getNodeType(), (AllowableFunctionReturnType<N>) ((SqmExpression<N>) x).getNodeType(),
queryEngine, queryEngine,
getJpaMetamodel().getTypeConfiguration() getJpaMetamodel().getTypeConfiguration()
@ -557,19 +596,19 @@ public <N extends Number> SqmExpression<N> abs(Expression<N> x) {
@Override @Override
public <N extends Number> SqmExpression<N> sum(Expression<? extends N> x, Expression<? extends N> y) { public <N extends Number> SqmExpression<N> sum(Expression<? extends N> x, Expression<? extends N> y) {
return createSqmArithmeticNode( BinaryArithmeticOperator.ADD, (SqmExpression) x, (SqmExpression) y ); return createSqmArithmeticNode( BinaryArithmeticOperator.ADD, (SqmExpression<?>) x, (SqmExpression<?>) y );
} }
private <N extends Number> SqmExpression<N> createSqmArithmeticNode( private <N extends Number> SqmExpression<N> createSqmArithmeticNode(
BinaryArithmeticOperator operator, BinaryArithmeticOperator operator,
SqmExpression leftHandExpression, SqmExpression<?> leftHandExpression,
SqmExpression rightHandExpression) { SqmExpression<?> rightHandExpression) {
//noinspection unchecked //noinspection unchecked
return new SqmBinaryArithmetic( return new SqmBinaryArithmetic<>(
operator, operator,
leftHandExpression, leftHandExpression,
rightHandExpression, rightHandExpression,
getDomainModel().getTypeConfiguration().resolveArithmeticType( (SqmExpressable<N>) getDomainModel().getTypeConfiguration().resolveArithmeticType(
leftHandExpression.getNodeType(), leftHandExpression.getNodeType(),
rightHandExpression.getNodeType(), rightHandExpression.getNodeType(),
operator operator
@ -580,17 +619,17 @@ private <N extends Number> SqmExpression<N> createSqmArithmeticNode(
@Override @Override
public <N extends Number> SqmExpression<N> sum(Expression<? extends N> x, N y) { public <N extends Number> SqmExpression<N> sum(Expression<? extends N> x, N y) {
return createSqmArithmeticNode( BinaryArithmeticOperator.ADD, (SqmExpression) x, value( y ) ); return createSqmArithmeticNode( BinaryArithmeticOperator.ADD, (SqmExpression<?>) x, value( y ) );
} }
@Override @Override
public <N extends Number> SqmExpression<N> sum(N x, Expression<? extends N> y) { public <N extends Number> SqmExpression<N> sum(N x, Expression<? extends N> y) {
return createSqmArithmeticNode( BinaryArithmeticOperator.ADD, value( x ), (SqmExpression) y ); return createSqmArithmeticNode( BinaryArithmeticOperator.ADD, value( x ), (SqmExpression<?>) y );
} }
@Override @Override
public <N extends Number> SqmExpression<N> prod(Expression<? extends N> x, Expression<? extends N> y) { public <N extends Number> SqmExpression<N> prod(Expression<? extends N> x, Expression<? extends N> y) {
return createSqmArithmeticNode( BinaryArithmeticOperator.ADD, value( x ), (SqmExpression) y ); return createSqmArithmeticNode( BinaryArithmeticOperator.ADD, value( x ), (SqmExpression<?>) y );
} }
@Override @Override
@ -607,8 +646,8 @@ public <N extends Number> SqmExpression<N> prod(N x, Expression<? extends N> y)
public <N extends Number> SqmExpression<N> diff(Expression<? extends N> x, Expression<? extends N> y) { public <N extends Number> SqmExpression<N> diff(Expression<? extends N> x, Expression<? extends N> y) {
return createSqmArithmeticNode( return createSqmArithmeticNode(
BinaryArithmeticOperator.SUBTRACT, BinaryArithmeticOperator.SUBTRACT,
(SqmExpression) x, (SqmExpression<?>) x,
(SqmExpression) y (SqmExpression<?>) y
); );
} }
@ -616,7 +655,7 @@ public <N extends Number> SqmExpression<N> diff(Expression<? extends N> x, Expre
public <N extends Number> SqmExpression<N> diff(Expression<? extends N> x, N y) { public <N extends Number> SqmExpression<N> diff(Expression<? extends N> x, N y) {
return createSqmArithmeticNode( return createSqmArithmeticNode(
BinaryArithmeticOperator.SUBTRACT, BinaryArithmeticOperator.SUBTRACT,
(SqmExpression) x, (SqmExpression<?>) x,
value( y ) value( y )
); );
} }
@ -626,7 +665,7 @@ public <N extends Number> SqmExpression<N> diff(N x, Expression<? extends N> y)
return createSqmArithmeticNode( return createSqmArithmeticNode(
BinaryArithmeticOperator.SUBTRACT, BinaryArithmeticOperator.SUBTRACT,
value( x ), value( x ),
(SqmExpression) y (SqmExpression<?>) y
); );
} }
@ -634,8 +673,8 @@ public <N extends Number> SqmExpression<N> diff(N x, Expression<? extends N> y)
public SqmExpression<Number> quot(Expression<? extends Number> x, Expression<? extends Number> y) { public SqmExpression<Number> quot(Expression<? extends Number> x, Expression<? extends Number> y) {
return createSqmArithmeticNode( return createSqmArithmeticNode(
BinaryArithmeticOperator.QUOT, BinaryArithmeticOperator.QUOT,
(SqmExpression) x, (SqmExpression<?>) x,
(SqmExpression) y (SqmExpression<?>) y
); );
} }
@ -643,7 +682,7 @@ public SqmExpression<Number> quot(Expression<? extends Number> x, Expression<? e
public SqmExpression<Number> quot(Expression<? extends Number> x, Number y) { public SqmExpression<Number> quot(Expression<? extends Number> x, Number y) {
return createSqmArithmeticNode( return createSqmArithmeticNode(
BinaryArithmeticOperator.QUOT, BinaryArithmeticOperator.QUOT,
(SqmExpression) x, (SqmExpression<?>) x,
value( y ) value( y )
); );
} }
@ -653,7 +692,7 @@ public SqmExpression<Number> quot(Number x, Expression<? extends Number> y) {
return createSqmArithmeticNode( return createSqmArithmeticNode(
BinaryArithmeticOperator.QUOT, BinaryArithmeticOperator.QUOT,
value( x ), value( x ),
(SqmExpression) y (SqmExpression<?>) y
); );
} }
@ -661,8 +700,8 @@ public SqmExpression<Number> quot(Number x, Expression<? extends Number> y) {
public SqmExpression<Integer> mod(Expression<Integer> x, Expression<Integer> y) { public SqmExpression<Integer> mod(Expression<Integer> x, Expression<Integer> y) {
return createSqmArithmeticNode( return createSqmArithmeticNode(
BinaryArithmeticOperator.MODULO, BinaryArithmeticOperator.MODULO,
(SqmExpression) x, (SqmExpression<?>) x,
(SqmExpression) y (SqmExpression<?>) y
); );
} }
@ -670,7 +709,7 @@ public SqmExpression<Integer> mod(Expression<Integer> x, Expression<Integer> y)
public SqmExpression<Integer> mod(Expression<Integer> x, Integer y) { public SqmExpression<Integer> mod(Expression<Integer> x, Integer y) {
return createSqmArithmeticNode( return createSqmArithmeticNode(
BinaryArithmeticOperator.MODULO, BinaryArithmeticOperator.MODULO,
(SqmExpression) x, (SqmExpression<?>) x,
value( y ) value( y )
); );
} }
@ -680,7 +719,7 @@ public SqmExpression<Integer> mod(Integer x, Expression<Integer> y) {
return createSqmArithmeticNode( return createSqmArithmeticNode(
BinaryArithmeticOperator.MODULO, BinaryArithmeticOperator.MODULO,
value( x ), value( x ),
(SqmExpression) y (SqmExpression<?>) y
); );
} }
@ -688,9 +727,9 @@ public SqmExpression<Integer> mod(Integer x, Expression<Integer> y) {
public SqmExpression<Double> sqrt(Expression<? extends Number> x) { public SqmExpression<Double> sqrt(Expression<? extends Number> x) {
//noinspection unchecked //noinspection unchecked
return getFunctionDescriptor("sqrt").generateSqmExpression( return getFunctionDescriptor("sqrt").generateSqmExpression(
(SqmTypedNode) x, (SqmTypedNode<?>) x,
(AllowableFunctionReturnType) QueryHelper.highestPrecedenceType2( (AllowableFunctionReturnType<Double>) QueryHelper.highestPrecedenceType2(
((SqmExpression) x).getNodeType(), ((SqmExpression<?>) x).getNodeType(),
StandardBasicTypes.DOUBLE StandardBasicTypes.DOUBLE
), ),
queryEngine, queryEngine,
@ -701,55 +740,55 @@ public SqmExpression<Double> sqrt(Expression<? extends Number> x) {
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public SqmExpression<Long> toLong(Expression<? extends Number> number) { public SqmExpression<Long> toLong(Expression<? extends Number> number) {
return ( (SqmExpression) number ).asLong(); return ( (SqmExpression<?>) number ).asLong();
} }
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public SqmExpression<Integer> toInteger(Expression<? extends Number> number) { public SqmExpression<Integer> toInteger(Expression<? extends Number> number) {
return ( (SqmExpression) number ).asInteger(); return ( (SqmExpression<?>) number ).asInteger();
} }
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public SqmExpression<Float> toFloat(Expression<? extends Number> number) { public SqmExpression<Float> toFloat(Expression<? extends Number> number) {
return ( (SqmExpression) number ).asFloat(); return ( (SqmExpression<?>) number ).asFloat();
} }
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public SqmExpression<Double> toDouble(Expression<? extends Number> number) { public SqmExpression<Double> toDouble(Expression<? extends Number> number) {
return ( (SqmExpression) number ).asDouble(); return ( (SqmExpression<?>) number ).asDouble();
} }
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public SqmExpression<BigDecimal> toBigDecimal(Expression<? extends Number> number) { public SqmExpression<BigDecimal> toBigDecimal(Expression<? extends Number> number) {
return ( (SqmExpression) number ).asBigDecimal(); return ( (SqmExpression<?>) number ).asBigDecimal();
} }
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public SqmExpression<BigInteger> toBigInteger(Expression<? extends Number> number) { public SqmExpression<BigInteger> toBigInteger(Expression<? extends Number> number) {
return ( (SqmExpression) number ).asBigInteger(); return ( (SqmExpression<?>) number ).asBigInteger();
} }
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public SqmExpression<String> toString(Expression<Character> character) { public SqmExpression<String> toString(Expression<Character> character) {
return ( (SqmExpression) character ).asString(); return ( (SqmExpression<?>) character ).asString();
} }
@Override @Override
@SuppressWarnings("unchecked")
public <T> SqmLiteral<T> literal(T value) { public <T> SqmLiteral<T> literal(T value) {
if ( value == null ) { if ( value == null ) {
return (SqmLiteral<T>) new SqmLiteralNull( this ); return new SqmLiteralNull<>( this );
} }
return new SqmLiteral( //noinspection unchecked
return new SqmLiteral<>(
value, value,
getTypeConfiguration().standardBasicTypeForJavaType( value.getClass() ), getTypeConfiguration().standardBasicTypeForJavaType( (Class<T>) value.getClass() ),
this this
); );
} }
@ -782,8 +821,7 @@ public <T> List<? extends SqmExpression<T>> literals(List<T> values) {
@Override @Override
public <T> SqmExpression<T> nullLiteral(Class<T> resultClass) { public <T> SqmExpression<T> nullLiteral(Class<T> resultClass) {
//noinspection unchecked return new SqmLiteralNull<>( getTypeConfiguration().standardBasicTypeForJavaType( resultClass ), this );
return new SqmLiteralNull( getTypeConfiguration().standardBasicTypeForJavaType( resultClass ), this );
} }
class MultiValueParameterType<T> implements AllowableParameterType<T> { class MultiValueParameterType<T> implements AllowableParameterType<T> {

View File

@ -122,12 +122,14 @@ public Object visitStatement(SqmStatement<?> sqmStatement) {
@Override @Override
public Object visitSelectStatement(SqmSelectStatement<?> statement) { public Object visitSelectStatement(SqmSelectStatement<?> statement) {
visitCteContainer( statement );
visitQueryPart( statement.getQueryPart() ); visitQueryPart( statement.getQueryPart() );
return statement; return statement;
} }
@Override @Override
public Object visitUpdateStatement(SqmUpdateStatement<?> statement) { public Object visitUpdateStatement(SqmUpdateStatement<?> statement) {
visitCteContainer( statement );
visitRootPath( statement.getTarget() ); visitRootPath( statement.getTarget() );
visitSetClause( statement.getSetClause() ); visitSetClause( statement.getSetClause() );
visitWhereClause( statement.getWhereClause() ); visitWhereClause( statement.getWhereClause() );
@ -151,6 +153,7 @@ public Object visitAssignment(SqmAssignment assignment) {
@Override @Override
public Object visitInsertSelectStatement(SqmInsertSelectStatement<?> statement) { public Object visitInsertSelectStatement(SqmInsertSelectStatement<?> statement) {
visitCteContainer( statement );
visitRootPath( statement.getTarget() ); visitRootPath( statement.getTarget() );
for ( SqmPath<?> stateField : statement.getInsertionTargetPaths() ) { for ( SqmPath<?> stateField : statement.getInsertionTargetPaths() ) {
stateField.accept( this ); stateField.accept( this );
@ -161,6 +164,7 @@ public Object visitInsertSelectStatement(SqmInsertSelectStatement<?> statement)
@Override @Override
public Object visitInsertValuesStatement(SqmInsertValuesStatement<?> statement) { public Object visitInsertValuesStatement(SqmInsertValuesStatement<?> statement) {
visitCteContainer( statement );
visitRootPath( statement.getTarget() ); visitRootPath( statement.getTarget() );
for ( SqmPath<?> stateField : statement.getInsertionTargetPaths() ) { for ( SqmPath<?> stateField : statement.getInsertionTargetPaths() ) {
stateField.accept( this ); stateField.accept( this );
@ -173,6 +177,7 @@ public Object visitInsertValuesStatement(SqmInsertValuesStatement<?> statement)
@Override @Override
public Object visitDeleteStatement(SqmDeleteStatement<?> statement) { public Object visitDeleteStatement(SqmDeleteStatement<?> statement) {
visitCteContainer( statement );
visitRootPath( statement.getTarget() ); visitRootPath( statement.getTarget() );
visitWhereClause( statement.getWhereClause() ); visitWhereClause( statement.getWhereClause() );
return statement; return statement;
@ -200,8 +205,11 @@ public Object visitQueryPart(SqmQueryPart<?> queryPart) {
@Override @Override
public Object visitQueryGroup(SqmQueryGroup<?> queryGroup) { public Object visitQueryGroup(SqmQueryGroup<?> queryGroup) {
for ( SqmQueryPart<?> queryPart : queryGroup.getQueryParts() ) { for ( SqmQueryPart<?> queryPart : queryGroup.getQueryParts() ) {
visitQueryPart( queryPart ); queryPart.accept( this );
} }
visitOrderByClause( queryGroup.getOrderByClause() );
visitOffsetExpression( queryGroup.getOffsetExpression() );
visitFetchExpression( queryGroup.getFetchExpression() );
return queryGroup; return queryGroup;
} }
@ -210,6 +218,8 @@ public Object visitQuerySpec(SqmQuerySpec<?> querySpec) {
visitFromClause( querySpec.getFromClause() ); visitFromClause( querySpec.getFromClause() );
visitSelectClause( querySpec.getSelectClause() ); visitSelectClause( querySpec.getSelectClause() );
visitWhereClause( querySpec.getWhereClause() ); visitWhereClause( querySpec.getWhereClause() );
visitGroupByClause( querySpec.getGroupByClauseExpressions() );
visitHavingClause( querySpec.getHavingClausePredicate() );
visitOrderByClause( querySpec.getOrderByClause() ); visitOrderByClause( querySpec.getOrderByClause() );
visitOffsetExpression( querySpec.getOffsetExpression() ); visitOffsetExpression( querySpec.getOffsetExpression() );
visitFetchExpression( querySpec.getFetchExpression() ); visitFetchExpression( querySpec.getFetchExpression() );
@ -228,7 +238,6 @@ public Object visitRootPath(SqmRoot<?> sqmRoot) {
return sqmRoot; return sqmRoot;
} }
@Override @Override
public Object visitCrossJoin(SqmCrossJoin<?> joinedFromElement) { public Object visitCrossJoin(SqmCrossJoin<?> joinedFromElement) {
joinedFromElement.visitSqmJoins( sqmJoin -> sqmJoin.accept( this ) ); joinedFromElement.visitSqmJoins( sqmJoin -> sqmJoin.accept( this ) );
@ -323,7 +332,7 @@ public Object visitSelection(SqmSelection selection) {
@Override @Override
public Object visitValues(SqmValues values) { public Object visitValues(SqmValues values) {
for ( SqmExpression expression : values.getExpressions() ) { for ( SqmExpression<?> expression : values.getExpressions() ) {
expression.accept( this ); expression.accept( this );
} }
return values; return values;
@ -409,7 +418,7 @@ public Object visitNegatedPredicate(SqmNegatedPredicate predicate) {
@Override @Override
public Object visitInListPredicate(SqmInListPredicate<?> predicate) { public Object visitInListPredicate(SqmInListPredicate<?> predicate) {
predicate.getTestExpression().accept( this ); predicate.getTestExpression().accept( this );
for ( SqmExpression expression : predicate.getListExpressions() ) { for ( SqmExpression<?> expression : predicate.getListExpressions() ) {
expression.accept( this ); expression.accept( this );
} }
return predicate; return predicate;
@ -473,6 +482,9 @@ public Object visitGroupByClause(List<SqmExpression<?>> groupByClauseExpressions
@Override @Override
public Object visitHavingClause(SqmPredicate sqmPredicate) { public Object visitHavingClause(SqmPredicate sqmPredicate) {
if ( sqmPredicate == null ) {
return null;
}
return sqmPredicate.accept( this ); return sqmPredicate.accept( this );
} }

View File

@ -348,7 +348,8 @@ public BaseSqmToSqlAstConverter(
if ( statement instanceof SqmSelectStatement<?> ) { if ( statement instanceof SqmSelectStatement<?> ) {
this.domainResults = new ArrayList<>( this.domainResults = new ArrayList<>(
( (SqmSelectStatement<?>) statement ).getQuerySpec() ( (SqmSelectStatement<?>) statement ).getQueryPart()
.getFirstQuerySpec()
.getSelectClause() .getSelectClause()
.getSelectionItems() .getSelectionItems()
.size() .size()
@ -507,6 +508,7 @@ public Stack<Clause> getCurrentClauseStack() {
@Override @Override
public SqmTranslation<T> translate() { public SqmTranslation<T> translate() {
final SqmStatement<?> sqmStatement = getStatement(); final SqmStatement<?> sqmStatement = getStatement();
//noinspection unchecked
final T statement = (T) sqmStatement.accept( this ); final T statement = (T) sqmStatement.accept( this );
return new StandardSqmTranslation<>( return new StandardSqmTranslation<>(
statement, statement,
@ -924,8 +926,7 @@ public InsertStatement visitInsertValuesStatement(SqmInsertValuesStatement<?> sq
@Override @Override
public Values visitValues(SqmValues sqmValues) { public Values visitValues(SqmValues sqmValues) {
Values values = new Values(); Values values = new Values();
//noinspection rawtypes for ( SqmExpression<?> expression : sqmValues.getExpressions() ) {
for ( SqmExpression expression : sqmValues.getExpressions() ) {
values.getExpressions().add( (Expression) expression.accept( this ) ); values.getExpressions().add( (Expression) expression.accept( this ) );
} }
return values; return values;

View File

@ -29,7 +29,6 @@ public static SqmLiteral<Timestamp> timestampLiteralFrom(String literalText, Sqm
LocalDateTime.from( JdbcTimestampTypeDescriptor.LITERAL_FORMATTER.parse( literalText ) ) LocalDateTime.from( JdbcTimestampTypeDescriptor.LITERAL_FORMATTER.parse( literalText ) )
); );
//noinspection unchecked
return new SqmLiteral<>( return new SqmLiteral<>(
literal, literal,
creationState.getCreationContext().getJpaMetamodel().getTypeConfiguration().standardBasicTypeForJavaType( Timestamp.class ), creationState.getCreationContext().getJpaMetamodel().getTypeConfiguration().standardBasicTypeForJavaType( Timestamp.class ),
@ -58,7 +57,6 @@ public static SqmLiteral<Date> dateLiteralFrom(String literalText, SqmCreationSt
final LocalDate localDate = LocalDate.from( JdbcDateTypeDescriptor.LITERAL_FORMATTER.parse( literalText ) ); final LocalDate localDate = LocalDate.from( JdbcDateTypeDescriptor.LITERAL_FORMATTER.parse( literalText ) );
final Date literal = new Date( localDate.toEpochDay() ); final Date literal = new Date( localDate.toEpochDay() );
//noinspection unchecked
return new SqmLiteral<>( return new SqmLiteral<>(
literal, literal,
creationState.getCreationContext().getJpaMetamodel().getTypeConfiguration().standardBasicTypeForJavaType( Date.class ), creationState.getCreationContext().getJpaMetamodel().getTypeConfiguration().standardBasicTypeForJavaType( Date.class ),
@ -70,7 +68,6 @@ public static SqmLiteral<Time> timeLiteralFrom(String literalText, SqmCreationSt
final LocalTime localTime = LocalTime.from( JdbcTimeTypeDescriptor.LITERAL_FORMATTER.parse( literalText ) ); final LocalTime localTime = LocalTime.from( JdbcTimeTypeDescriptor.LITERAL_FORMATTER.parse( literalText ) );
final Time literal = Time.valueOf( localTime ); final Time literal = Time.valueOf( localTime );
//noinspection unchecked
return new SqmLiteral<>( return new SqmLiteral<>(
literal, literal,
creationState.getCreationContext().getJpaMetamodel().getTypeConfiguration().standardBasicTypeForJavaType( Time.class ), creationState.getCreationContext().getJpaMetamodel().getTypeConfiguration().standardBasicTypeForJavaType( Time.class ),

View File

@ -15,9 +15,9 @@
* @author Gavin King * @author Gavin King
*/ */
public class SqmValues { public class SqmValues {
private List<SqmExpression> expressions = new ArrayList<>(); private final List<SqmExpression<?>> expressions = new ArrayList<>();
public List<SqmExpression> getExpressions() { public List<SqmExpression<?>> getExpressions() {
return expressions; return expressions;
} }
} }

View File

@ -62,13 +62,13 @@ public SqmExpressable<T> getNodeType() {
protected final void setExpressableType(SqmExpressable<?> expressableType) { protected final void setExpressableType(SqmExpressable<?> expressableType) {
//noinspection unchecked //noinspection unchecked
this.expressableType = (SqmExpressable) expressableType; this.expressableType = (SqmExpressable<T>) expressableType;
} }
/** /**
* Protected access to set the JavaTypeDescriptor via Java Class * Protected access to set the JavaTypeDescriptor via Java Class
*/ */
protected void setJavaType(Class targetType) { protected void setJavaType(Class<T> targetType) {
if ( targetType != null ) { if ( targetType != null ) {
setExpressableType( setExpressableType(
nodeBuilder().getDomainModel() nodeBuilder().getDomainModel()

View File

@ -35,67 +35,65 @@
public class SqmDynamicInstantiation<T> public class SqmDynamicInstantiation<T>
extends AbstractJpaSelection<T> extends AbstractJpaSelection<T>
implements SqmSelectableNode<T>, implements SqmSelectableNode<T>,
SqmAliasedExpressionContainer<SqmDynamicInstantiationArgument>, SqmAliasedExpressionContainer<SqmDynamicInstantiationArgument<?>>,
JpaCompoundSelection<T>, JpaCompoundSelection<T>,
DomainResultProducer<T> { DomainResultProducer<T> {
private static final Logger log = Logger.getLogger( SqmDynamicInstantiation.class ); private static final Logger log = Logger.getLogger( SqmDynamicInstantiation.class );
public static SqmDynamicInstantiation forClassInstantiation( public static <R> SqmDynamicInstantiation<R> forClassInstantiation(
JavaTypeDescriptor targetJavaType, JavaTypeDescriptor<R> targetJavaType,
NodeBuilder nodeBuilder) { NodeBuilder nodeBuilder) {
//noinspection unchecked return new SqmDynamicInstantiation<>(
return new SqmDynamicInstantiation( new DynamicInstantiationTargetImpl<>( CLASS, targetJavaType ),
new DynamicInstantiationTargetImpl( CLASS, targetJavaType ),
nodeBuilder nodeBuilder
); );
} }
public static SqmDynamicInstantiation forClassInstantiation( public static <R> SqmDynamicInstantiation<R> forClassInstantiation(
Class targetJavaType, Class<R> targetJavaType,
NodeBuilder nodeBuilder) { NodeBuilder nodeBuilder) {
//noinspection unchecked
return forClassInstantiation( return forClassInstantiation(
nodeBuilder.getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( targetJavaType ), nodeBuilder.getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( targetJavaType ),
nodeBuilder nodeBuilder
); );
} }
public static SqmDynamicInstantiation forMapInstantiation( public static <M extends Map<?, ?>> SqmDynamicInstantiation<M> forMapInstantiation(
JavaTypeDescriptor<Map> mapJavaTypeDescriptor, JavaTypeDescriptor<M> mapJavaTypeDescriptor,
NodeBuilder nodeBuilder) { NodeBuilder nodeBuilder) {
//noinspection unchecked return new SqmDynamicInstantiation<>(
return new SqmDynamicInstantiation( new DynamicInstantiationTargetImpl<>( MAP, mapJavaTypeDescriptor ),
new DynamicInstantiationTargetImpl( MAP, mapJavaTypeDescriptor ),
nodeBuilder nodeBuilder
); );
} }
public static SqmDynamicInstantiation forMapInstantiation(NodeBuilder nodeBuilder) { public static <M extends Map<?, ?>> SqmDynamicInstantiation<M> forMapInstantiation(NodeBuilder nodeBuilder) {
return forMapInstantiation( //noinspection unchecked
return (SqmDynamicInstantiation<M>) (SqmDynamicInstantiation<?>) forMapInstantiation(
nodeBuilder.getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Map.class ), nodeBuilder.getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( Map.class ),
nodeBuilder nodeBuilder
); );
} }
public static SqmDynamicInstantiation forListInstantiation( public static <L extends List<?>> SqmDynamicInstantiation<L> forListInstantiation(
JavaTypeDescriptor<List> listJavaTypeDescriptor, JavaTypeDescriptor<L> listJavaTypeDescriptor,
NodeBuilder nodeBuilder) { NodeBuilder nodeBuilder) {
//noinspection unchecked return new SqmDynamicInstantiation<>(
return new SqmDynamicInstantiation( new DynamicInstantiationTargetImpl<>( LIST, listJavaTypeDescriptor ),
new DynamicInstantiationTargetImpl( LIST, listJavaTypeDescriptor ),
nodeBuilder nodeBuilder
); );
} }
public static SqmDynamicInstantiation forListInstantiation(NodeBuilder nodeBuilder) { public static <L extends List<?>> SqmDynamicInstantiation<L> forListInstantiation(NodeBuilder nodeBuilder) {
return forListInstantiation( //noinspection unchecked
return (SqmDynamicInstantiation<L>) (SqmDynamicInstantiation<?>) forListInstantiation(
nodeBuilder.getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( List.class ), nodeBuilder.getTypeConfiguration().getJavaTypeDescriptorRegistry().getDescriptor( List.class ),
nodeBuilder nodeBuilder
); );
} }
private final SqmDynamicInstantiationTarget <T>instantiationTarget; private final SqmDynamicInstantiationTarget <T> instantiationTarget;
private List<SqmDynamicInstantiationArgument<?>> arguments; private List<SqmDynamicInstantiationArgument<?>> arguments;
private SqmDynamicInstantiation( private SqmDynamicInstantiation(
@ -123,7 +121,7 @@ public String asLoggableText() {
return "<new " + instantiationTarget.getJavaType().getName() + ">"; return "<new " + instantiationTarget.getJavaType().getName() + ">";
} }
public void addArgument(SqmDynamicInstantiationArgument argument) { public void addArgument(SqmDynamicInstantiationArgument<?> argument) {
if ( instantiationTarget.getNature() == LIST ) { if ( instantiationTarget.getNature() == LIST ) {
// really should not have an alias... // really should not have an alias...
if ( argument.getAlias() != null && log.isDebugEnabled() ) { if ( argument.getAlias() != null && log.isDebugEnabled() ) {
@ -153,8 +151,8 @@ else if ( instantiationTarget.getNature() == MAP ) {
} }
@Override @Override
public SqmDynamicInstantiationArgument add(SqmExpression<?> expression, String alias) { public SqmDynamicInstantiationArgument<?> add(SqmExpression<?> expression, String alias) {
final SqmDynamicInstantiationArgument argument = new SqmDynamicInstantiationArgument<>( final SqmDynamicInstantiationArgument<?> argument = new SqmDynamicInstantiationArgument<>(
expression, expression,
alias, alias,
nodeBuilder() nodeBuilder()
@ -164,7 +162,7 @@ public SqmDynamicInstantiationArgument add(SqmExpression<?> expression, String a
} }
@Override @Override
public void add(SqmDynamicInstantiationArgument aliasExpression) { public void add(SqmDynamicInstantiationArgument<?> aliasExpression) {
addArgument( aliasExpression ); addArgument( aliasExpression );
} }
@ -210,7 +208,7 @@ public JavaTypeDescriptor<T> getExpressableJavaTypeDescriptor() {
@Override @Override
public void visitSubSelectableNodes(Consumer<SqmSelectableNode<?>> consumer) { public void visitSubSelectableNodes(Consumer<SqmSelectableNode<?>> consumer) {
for ( SqmDynamicInstantiationArgument argument : arguments ) { for ( SqmDynamicInstantiationArgument<?> argument : arguments ) {
consumer.accept( argument.getSelectableNode() ); consumer.accept( argument.getSelectableNode() );
} }
} }

View File

@ -6,10 +6,16 @@
*/ */
package org.hibernate.query.sqm.tree.select; package org.hibernate.query.sqm.tree.select;
import java.util.Collections;
import java.util.List; import java.util.List;
import org.hibernate.FetchClauseType;
import org.hibernate.SetOperator; import org.hibernate.SetOperator;
import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.query.criteria.JpaExpression;
import org.hibernate.query.criteria.JpaOrder;
import org.hibernate.query.criteria.JpaQueryGroup;
import org.hibernate.query.criteria.JpaQueryPart;
import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker; import org.hibernate.query.sqm.SemanticQueryWalker;
@ -18,7 +24,7 @@
* *
* @author Christian Beikov * @author Christian Beikov
*/ */
public class SqmQueryGroup<T> extends SqmQueryPart<T> { public class SqmQueryGroup<T> extends SqmQueryPart<T> implements JpaQueryGroup<T> {
private final List<SqmQueryPart<T>> queryParts; private final List<SqmQueryPart<T>> queryParts;
private SetOperator setOperator; private SetOperator setOperator;
@ -36,6 +42,10 @@ public SqmQueryGroup(
this.queryParts = queryParts; this.queryParts = queryParts;
} }
public List<SqmQueryPart<T>> queryParts() {
return queryParts;
}
@Override @Override
public SqmQuerySpec<T> getFirstQuerySpec() { public SqmQuerySpec<T> getFirstQuerySpec() {
return queryParts.get( 0 ).getFirstQuerySpec(); return queryParts.get( 0 ).getFirstQuerySpec();
@ -56,15 +66,41 @@ public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitQueryGroup( this ); return walker.visitQueryGroup( this );
} }
@Override
public List<SqmQueryPart<T>> getQueryParts() { public List<SqmQueryPart<T>> getQueryParts() {
return queryParts; return Collections.unmodifiableList( queryParts );
} }
@Override
public SetOperator getSetOperator() { public SetOperator getSetOperator() {
return setOperator; return setOperator;
} }
@Override
public void setSetOperator(SetOperator setOperator) { public void setSetOperator(SetOperator setOperator) {
if ( setOperator == null ) {
throw new IllegalArgumentException();
}
this.setOperator = setOperator; this.setOperator = setOperator;
} }
@Override
public SqmQueryGroup<T> setSortSpecifications(List<? extends JpaOrder> sortSpecifications) {
return (SqmQueryGroup<T>) super.setSortSpecifications( sortSpecifications );
}
@Override
public SqmQueryGroup<T> setOffset(JpaExpression<?> offset) {
return (SqmQueryGroup<T>) super.setOffset( offset );
}
@Override
public SqmQueryGroup<T> setFetch(JpaExpression<?> fetch) {
return (SqmQueryGroup<T>) super.setFetch( fetch );
}
@Override
public SqmQueryGroup<T> setFetch(JpaExpression<?> fetch, FetchClauseType fetchClauseType) {
return (SqmQueryGroup<T>) super.setFetch( fetch, fetchClauseType );
}
} }

View File

@ -12,6 +12,7 @@
import org.hibernate.FetchClauseType; import org.hibernate.FetchClauseType;
import org.hibernate.query.criteria.JpaExpression; import org.hibernate.query.criteria.JpaExpression;
import org.hibernate.query.criteria.JpaOrder; import org.hibernate.query.criteria.JpaOrder;
import org.hibernate.query.criteria.JpaQueryPart;
import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.tree.SqmVisitableNode; import org.hibernate.query.sqm.tree.SqmVisitableNode;
import org.hibernate.query.sqm.tree.expression.SqmExpression; import org.hibernate.query.sqm.tree.expression.SqmExpression;
@ -22,7 +23,7 @@
* *
* @author Christian Beikov * @author Christian Beikov
*/ */
public abstract class SqmQueryPart<T> implements SqmVisitableNode { public abstract class SqmQueryPart<T> implements SqmVisitableNode, JpaQueryPart<T> {
private final NodeBuilder nodeBuilder; private final NodeBuilder nodeBuilder;
private SqmOrderByClause orderByClause; private SqmOrderByClause orderByClause;
@ -88,6 +89,7 @@ public void setFetchExpression(SqmExpression<?> fetchExpression, FetchClauseType
} }
} }
@Override
public FetchClauseType getFetchClauseType() { public FetchClauseType getFetchClauseType() {
return fetchClauseType; return fetchClauseType;
} }
@ -95,6 +97,7 @@ public FetchClauseType getFetchClauseType() {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// JPA // JPA
@Override
public List<SqmSortSpecification> getSortSpecifications() { public List<SqmSortSpecification> getSortSpecifications() {
if ( getOrderByClause() == null ) { if ( getOrderByClause() == null ) {
return Collections.emptyList(); return Collections.emptyList();
@ -103,6 +106,7 @@ public List<SqmSortSpecification> getSortSpecifications() {
return getOrderByClause().getSortSpecifications(); return getOrderByClause().getSortSpecifications();
} }
@Override
public SqmQueryPart<T> setSortSpecifications(List<? extends JpaOrder> sortSpecifications) { public SqmQueryPart<T> setSortSpecifications(List<? extends JpaOrder> sortSpecifications) {
if ( getOrderByClause() == null ) { if ( getOrderByClause() == null ) {
setOrderByClause( new SqmOrderByClause() ); setOrderByClause( new SqmOrderByClause() );
@ -115,22 +119,32 @@ public SqmQueryPart<T> setSortSpecifications(List<? extends JpaOrder> sortSpecif
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override
public SqmExpression<?> getOffset() { public SqmExpression<?> getOffset() {
return getOffsetExpression(); return getOffsetExpression();
} }
@Override
public SqmQueryPart<T> setOffset(JpaExpression<?> offset) { public SqmQueryPart<T> setOffset(JpaExpression<?> offset) {
setOffsetExpression( (SqmExpression<?>) offset ); setOffsetExpression( (SqmExpression<?>) offset );
return this; return this;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override
public SqmExpression<?> getFetch() { public SqmExpression<?> getFetch() {
return getFetchExpression(); return getFetchExpression();
} }
@Override
public SqmQueryPart<T> setFetch(JpaExpression<?> fetch) { public SqmQueryPart<T> setFetch(JpaExpression<?> fetch) {
setFetchExpression( (SqmExpression<?>) fetch ); setFetchExpression( (SqmExpression<?>) fetch );
return this; return this;
} }
@Override
public JpaQueryPart<T> setFetch(JpaExpression<?> fetch, FetchClauseType fetchClauseType) {
setFetchExpression( (SqmExpression<?>) fetch, fetchClauseType );
return this;
}
} }

View File

@ -21,8 +21,10 @@
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Selection; import javax.persistence.criteria.Selection;
import org.hibernate.FetchClauseType;
import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.query.criteria.JpaCriteriaQuery; import org.hibernate.query.criteria.JpaCriteriaQuery;
import org.hibernate.query.criteria.JpaExpression;
import org.hibernate.query.criteria.JpaSelection; import org.hibernate.query.criteria.JpaSelection;
import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker; import org.hibernate.query.sqm.SemanticQueryWalker;
@ -58,6 +60,15 @@ public SqmSelectStatement(Class<T> resultJavaType, SqmQuerySource querySource, N
this.querySource = querySource; this.querySource = querySource;
} }
public SqmSelectStatement(
SqmQueryPart<T> queryPart,
Class<T> resultType,
SqmQuerySource querySource,
NodeBuilder builder) {
super( queryPart, resultType, builder );
this.querySource = querySource;
}
/** /**
* @implNote This form is used from Hibernate's JPA criteria handling. * @implNote This form is used from Hibernate's JPA criteria handling.
*/ */
@ -75,6 +86,52 @@ public SqmQuerySource getQuerySource() {
return querySource; return querySource;
} }
@Override
public SqmQuerySpec<T> getQuerySpec() {
if ( querySource == SqmQuerySource.CRITERIA ) {
final SqmQueryPart<T> queryPart = getQueryPart();
if ( queryPart instanceof SqmQuerySpec<?> ) {
return (SqmQuerySpec<T>) queryPart;
}
throw new IllegalStateException(
"Query group can't be treated as query spec. Use JpaSelectCriteria#getQueryPart to access query group details"
);
}
else {
return super.getQuerySpec();
}
}
public boolean containsCollectionFetches() {
return containsCollectionFetches( getQueryPart() );
}
private boolean containsCollectionFetches(SqmQueryPart<?> queryPart) {
if ( queryPart instanceof SqmQuerySpec<?> ) {
return ( (SqmQuerySpec<?>) queryPart ).containsCollectionFetches();
}
else {
// We only have to check the first one
final SqmQueryGroup<?> queryGroup = (SqmQueryGroup<?>) queryPart;
return containsCollectionFetches( queryGroup.getQueryParts().get( 0 ) );
}
}
public boolean usesDistinct() {
return usesDistinct( getQueryPart() );
}
private boolean usesDistinct(SqmQueryPart<?> queryPart) {
if ( queryPart instanceof SqmQuerySpec<?> ) {
return ( (SqmQuerySpec<?>) queryPart ).getSelectClause().isDistinct();
}
else {
// We only have to check the first one
final SqmQueryGroup<?> queryGroup = (SqmQueryGroup<?>) queryPart;
return usesDistinct( queryGroup.getQueryParts().get( 0 ) );
}
}
@Override @Override
public Set<SqmParameter<?>> getSqmParameters() { public Set<SqmParameter<?>> getSqmParameters() {
if ( querySource == SqmQuerySource.CRITERIA ) { if ( querySource == SqmQuerySource.CRITERIA ) {
@ -265,7 +322,7 @@ public SqmSelectStatement<T> select(Selection<? extends T> selection) {
@Override @Override
public SqmSelectStatement<T> multiselect(Selection<?>... selections) { public SqmSelectStatement<T> multiselect(Selection<?>... selections) {
for ( Selection<?> selection : selections ) { for ( Selection<?> selection : selections ) {
getQuerySpec().getSelectClause().add( (SqmExpression) selection, selection.getAlias() ); getQuerySpec().getSelectClause().add( (SqmExpression<?>) selection, selection.getAlias() );
} }
setResultType( (Class<T>) Object[].class ); setResultType( (Class<T>) Object[].class );
return this; return this;
@ -274,7 +331,7 @@ public SqmSelectStatement<T> multiselect(Selection<?>... selections) {
@Override @Override
public SqmSelectStatement<T> multiselect(List<Selection<?>> selectionList) { public SqmSelectStatement<T> multiselect(List<Selection<?>> selectionList) {
for ( Selection<?> selection : selectionList ) { for ( Selection<?> selection : selectionList ) {
getQuerySpec().getSelectClause().add( (SqmExpression) selection, selection.getAlias() ); getQuerySpec().getSelectClause().add( (SqmExpression<?>) selection, selection.getAlias() );
} }
setResultType( (Class<T>) Object[].class ); setResultType( (Class<T>) Object[].class );
return this; return this;
@ -282,22 +339,22 @@ public SqmSelectStatement<T> multiselect(List<Selection<?>> selectionList) {
@Override @Override
public SqmSelectStatement<T> orderBy(Order... orders) { public SqmSelectStatement<T> orderBy(Order... orders) {
if ( getQuerySpec().getOrderByClause() == null ) { if ( getQueryPart().getOrderByClause() == null ) {
getQuerySpec().setOrderByClause( new SqmOrderByClause() ); getQueryPart().setOrderByClause( new SqmOrderByClause() );
} }
for ( Order order : orders ) { for ( Order order : orders ) {
getQuerySpec().getOrderByClause().addSortSpecification( (SqmSortSpecification) order ); getQueryPart().getOrderByClause().addSortSpecification( (SqmSortSpecification) order );
} }
return this; return this;
} }
@Override @Override
public SqmSelectStatement<T> orderBy(List<Order> orders) { public SqmSelectStatement<T> orderBy(List<Order> orders) {
if ( getQuerySpec().getOrderByClause() == null ) { if ( getQueryPart().getOrderByClause() == null ) {
getQuerySpec().setOrderByClause( new SqmOrderByClause() ); getQueryPart().setOrderByClause( new SqmOrderByClause() );
} }
for ( Order order : orders ) { for ( Order order : orders ) {
getQuerySpec().getOrderByClause().addSortSpecification( (SqmSortSpecification) order ); getQueryPart().getOrderByClause().addSortSpecification( (SqmSortSpecification) order );
} }
return this; return this;
} }
@ -336,4 +393,55 @@ public SqmSelectStatement<T> having(Expression<Boolean> booleanExpression) {
public SqmSelectStatement<T> having(Predicate... predicates) { public SqmSelectStatement<T> having(Predicate... predicates) {
return (SqmSelectStatement<T>) super.having( predicates ); return (SqmSelectStatement<T>) super.having( predicates );
} }
@Override
public JpaExpression<Number> getOffset() {
return (JpaExpression<Number>) getQueryPart().getOffset();
}
@Override
public JpaCriteriaQuery<T> offset(JpaExpression<? extends Number> offset) {
getQueryPart().setOffset( offset );
return this;
}
@Override
public JpaCriteriaQuery<T> offset(Number offset) {
getQueryPart().setOffset( nodeBuilder().value( offset ) );
return this;
}
@Override
public JpaExpression<Number> getFetch() {
return (JpaExpression<Number>) getQueryPart().getFetch();
}
@Override
public JpaCriteriaQuery<T> fetch(JpaExpression<? extends Number> fetch) {
getQueryPart().setFetch( fetch );
return this;
}
@Override
public JpaCriteriaQuery<T> fetch(JpaExpression<? extends Number> fetch, FetchClauseType fetchClauseType) {
getQueryPart().setFetch( fetch, fetchClauseType );
return this;
}
@Override
public JpaCriteriaQuery<T> fetch(Number fetch) {
getQueryPart().setFetch( nodeBuilder().value( fetch ) );
return this;
}
@Override
public JpaCriteriaQuery<T> fetch(Number fetch, FetchClauseType fetchClauseType) {
getQueryPart().setFetch( nodeBuilder().value( fetch ), fetchClauseType );
return this;
}
@Override
public FetchClauseType getFetchClauseType() {
return getQueryPart().getFetchClauseType();
}
} }

View File

@ -12,7 +12,7 @@
import java.util.List; import java.util.List;
public class Values { public class Values {
private List<Expression> expressions = new ArrayList<>(); private final List<Expression> expressions = new ArrayList<>();
public List<Expression> getExpressions() { public List<Expression> getExpressions() {
return expressions; return expressions;

View File

@ -32,10 +32,10 @@ public class BasicTypeRegistry implements Serializable {
private final TypeConfiguration typeConfiguration; private final TypeConfiguration typeConfiguration;
private final Map<SqlTypeDescriptor,Map<JavaTypeDescriptor<?>,BasicType<?>>> registryValues = new ConcurrentHashMap<>(); private final Map<SqlTypeDescriptor, Map<JavaTypeDescriptor<?>, BasicType<?>>> registryValues = new ConcurrentHashMap<>();
private boolean primed; private boolean primed;
private Map<String, BasicType> typesByName = new ConcurrentHashMap<>(); private final Map<String, BasicType<?>> typesByName = new ConcurrentHashMap<>();
public BasicTypeRegistry(TypeConfiguration typeConfiguration){ public BasicTypeRegistry(TypeConfiguration typeConfiguration){
this.typeConfiguration = typeConfiguration; this.typeConfiguration = typeConfiguration;
@ -44,11 +44,12 @@ public BasicTypeRegistry(TypeConfiguration typeConfiguration){
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Access // Access
public BasicType getRegisteredType(String key) { public <J> BasicType<J> getRegisteredType(String key) {
return typesByName.get( key ); //noinspection unchecked
return (BasicType<J>) typesByName.get( key );
} }
public BasicType getRegisteredType(Class javaType) { public <J> BasicType<J> getRegisteredType(Class<J> javaType) {
return getRegisteredType( javaType.getName() ); return getRegisteredType( javaType.getName() );
} }
@ -56,12 +57,12 @@ public BasicType getRegisteredType(Class javaType) {
* Find an existing BasicType registration for the given JavaTypeDescriptor and * Find an existing BasicType registration for the given JavaTypeDescriptor and
* SqlTypeDescriptor combo or create (and register) one. * SqlTypeDescriptor combo or create (and register) one.
*/ */
public BasicType<?> resolve(JavaTypeDescriptor<?> jtdToUse, SqlTypeDescriptor stdToUse) { public <J> BasicType<J> resolve(JavaTypeDescriptor<J> jtdToUse, SqlTypeDescriptor stdToUse) {
//noinspection unchecked //noinspection unchecked
return resolve( return resolve(
jtdToUse, jtdToUse,
stdToUse, stdToUse,
() -> new StandardBasicTypeImpl( jtdToUse, stdToUse ) () -> new StandardBasicTypeImpl<>( jtdToUse, stdToUse )
); );
} }
@ -69,28 +70,29 @@ public BasicType<?> resolve(JavaTypeDescriptor<?> jtdToUse, SqlTypeDescriptor st
* Find an existing BasicType registration for the given JavaTypeDescriptor and * Find an existing BasicType registration for the given JavaTypeDescriptor and
* SqlTypeDescriptor combo or create (and register) one. * SqlTypeDescriptor combo or create (and register) one.
*/ */
public BasicType<?> resolve(JavaTypeDescriptor<?> jtdToUse, SqlTypeDescriptor stdToUse, Supplier<BasicType<?>> creator) { public <J> BasicType<J> resolve(JavaTypeDescriptor<J> jtdToUse, SqlTypeDescriptor stdToUse, Supplier<BasicType<J>> creator) {
final Map<JavaTypeDescriptor<?>, BasicType<?>> typeByJtdForStd = registryValues.computeIfAbsent( final Map<JavaTypeDescriptor<?>, BasicType<?>> typeByJtdForStd = registryValues.computeIfAbsent(
stdToUse, stdToUse,
sqlTypeDescriptor -> new ConcurrentHashMap<>() sqlTypeDescriptor -> new ConcurrentHashMap<>()
); );
return typeByJtdForStd.computeIfAbsent( jtdToUse, javaDescriptor -> creator.get() ); //noinspection unchecked
return (BasicType<J>) typeByJtdForStd.computeIfAbsent( jtdToUse, javaDescriptor -> creator.get() );
} }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Mutations // Mutations
public void register(BasicType type) { public void register(BasicType<?> type) {
register( type, type.getRegistrationKeys() ); register( type, type.getRegistrationKeys() );
} }
public void register(BasicType type, String key) { public void register(BasicType<?> type, String key) {
typesByName.put( key, type ); typesByName.put( key, type );
} }
public void register(BasicType type, String... keys) { public void register(BasicType<?> type, String... keys) {
if ( ! isPrimed() ) { if ( ! isPrimed() ) {
throw new IllegalStateException( "BasicTypeRegistry not yet primed. Calls to `#register` not valid until after primed" ); throw new IllegalStateException( "BasicTypeRegistry not yet primed. Calls to `#register` not valid until after primed" );
} }
@ -110,7 +112,7 @@ public void register(BasicType type, String... keys) {
} }
} }
private void applyOrOverwriteEntry(BasicType type) { private void applyOrOverwriteEntry(BasicType<?> type) {
final Map<JavaTypeDescriptor<?>, BasicType<?>> mappingsForStdToUse = registryValues.computeIfAbsent( final Map<JavaTypeDescriptor<?>, BasicType<?>> mappingsForStdToUse = registryValues.computeIfAbsent(
type.getSqlTypeDescriptor(), type.getSqlTypeDescriptor(),
sqlTypeDescriptor -> new ConcurrentHashMap<>() sqlTypeDescriptor -> new ConcurrentHashMap<>()
@ -133,7 +135,7 @@ public void register(UserType type, String... keys) {
public void unregister(String... keys) { public void unregister(String... keys) {
for ( String key : keys ) { for ( String key : keys ) {
final BasicType removed = typesByName.remove( key ); final BasicType<?> removed = typesByName.remove( key );
} }
@ -151,7 +153,7 @@ public void primed() {
this.primed = true; this.primed = true;
} }
public void addPrimeEntry(BasicType type, String legacyTypeClassName, String[] registrationKeys) { public void addPrimeEntry(BasicType<?> type, String legacyTypeClassName, String[] registrationKeys) {
if ( primed ) { if ( primed ) {
throw new IllegalStateException( "BasicTypeRegistry already primed" ); throw new IllegalStateException( "BasicTypeRegistry already primed" );
} }
@ -176,7 +178,7 @@ public void addPrimeEntry(BasicType type, String legacyTypeClassName, String[] r
} }
} }
private void primeRegistryEntry(BasicType type) { private void primeRegistryEntry(BasicType<?> type) {
final Map<JavaTypeDescriptor<?>, BasicType<?>> mappingsForStdToUse = registryValues.computeIfAbsent( final Map<JavaTypeDescriptor<?>, BasicType<?>> mappingsForStdToUse = registryValues.computeIfAbsent(
type.getSqlTypeDescriptor(), type.getSqlTypeDescriptor(),
sqlTypeDescriptor -> new ConcurrentHashMap<>() sqlTypeDescriptor -> new ConcurrentHashMap<>()
@ -197,7 +199,7 @@ private void primeRegistryEntry(BasicType type) {
} }
} }
private void applyRegistrationKeys(BasicType type, String[] keys) { private void applyRegistrationKeys(BasicType<?> type, String[] keys) {
for ( String key : keys ) { for ( String key : keys ) {
// be safe... // be safe...
if ( key == null ) { if ( key == null ) {

View File

@ -541,22 +541,22 @@ else if ( matchesJavaType( secondType, Short.class ) ) {
} }
} }
@SuppressWarnings("unchecked") private static boolean matchesJavaType(SqmExpressable<?> type, Class<?> javaType) {
private static boolean matchesJavaType(SqmExpressable type, Class javaType) {
assert javaType != null; assert javaType != null;
return type != null && javaType.isAssignableFrom( type.getExpressableJavaTypeDescriptor().getJavaType() ); return type != null && javaType.isAssignableFrom( type.getExpressableJavaTypeDescriptor().getJavaType() );
} }
private final ConcurrentHashMap<Class,BasicType> basicTypeByJavaType = new ConcurrentHashMap<>(); private final ConcurrentHashMap<Class<?>, BasicType<?>> basicTypeByJavaType = new ConcurrentHashMap<>();
public BasicType getBasicTypeForJavaType(Class<?> javaType) { public <J> BasicType<J> getBasicTypeForJavaType(Class<J> javaType) {
final BasicType existing = basicTypeByJavaType.get( javaType ); final BasicType<?> existing = basicTypeByJavaType.get( javaType );
if ( existing != null ) { if ( existing != null ) {
return existing; //noinspection unchecked
return (BasicType<J>) existing;
} }
final BasicType registeredType = getBasicTypeRegistry().getRegisteredType( javaType ); final BasicType<J> registeredType = getBasicTypeRegistry().getRegisteredType( javaType );
if ( registeredType != null ) { if ( registeredType != null ) {
basicTypeByJavaType.put( javaType, registeredType ); basicTypeByJavaType.put( javaType, registeredType );
return registeredType; return registeredType;
@ -565,7 +565,7 @@ public BasicType getBasicTypeForJavaType(Class<?> javaType) {
return null; return null;
} }
public BasicType standardBasicTypeForJavaType(Class<?> javaType) { public <J> BasicType<J> standardBasicTypeForJavaType(Class<J> javaType) {
if ( javaType == null ) { if ( javaType == null ) {
return null; return null;
} }
@ -573,48 +573,49 @@ public BasicType standardBasicTypeForJavaType(Class<?> javaType) {
//noinspection unchecked //noinspection unchecked
return standardBasicTypeForJavaType( return standardBasicTypeForJavaType(
javaType, javaType,
javaTypeDescriptor -> new StandardBasicTypeImpl( javaTypeDescriptor -> new StandardBasicTypeImpl<>(
javaTypeDescriptor, javaTypeDescriptor,
javaTypeDescriptor.getJdbcRecommendedSqlType( getCurrentBaseSqlTypeIndicators() ) javaTypeDescriptor.getJdbcRecommendedSqlType( getCurrentBaseSqlTypeIndicators() )
) )
); );
} }
public BasicType standardBasicTypeForJavaType( public <J> BasicType<J> standardBasicTypeForJavaType(
Class<?> javaType, Class<J> javaType,
Function<JavaTypeDescriptor<?>,BasicType> creator) { Function<JavaTypeDescriptor<J>, BasicType<J>> creator) {
if ( javaType == null ) { if ( javaType == null ) {
return null; return null;
} }
return basicTypeByJavaType.computeIfAbsent( //noinspection unchecked
return (BasicType<J>) basicTypeByJavaType.computeIfAbsent(
javaType, javaType,
jt -> { jt -> {
// See if one exists in the BasicTypeRegistry and use that one if so // See if one exists in the BasicTypeRegistry and use that one if so
final BasicType registeredType = basicTypeRegistry.getRegisteredType( javaType ); final BasicType<J> registeredType = basicTypeRegistry.getRegisteredType( javaType );
if ( registeredType != null ) { if ( registeredType != null ) {
return registeredType; return registeredType;
} }
// otherwise, apply the creator // otherwise, apply the creator
final JavaTypeDescriptor javaTypeDescriptor = javaTypeDescriptorRegistry.resolveDescriptor( javaType ); final JavaTypeDescriptor<J> javaTypeDescriptor = javaTypeDescriptorRegistry.resolveDescriptor( javaType );
return creator.apply( javaTypeDescriptor ); return creator.apply( javaTypeDescriptor );
} }
); );
} }
public TemporalType getSqlTemporalType(SqmExpressable type) { public TemporalType getSqlTemporalType(SqmExpressable<?> type) {
if ( type == null ) { if ( type == null ) {
return null; return null;
} }
return getSqlTemporalType( type.getExpressableJavaTypeDescriptor().getJdbcRecommendedSqlType( getCurrentBaseSqlTypeIndicators() ) ); return getSqlTemporalType( type.getExpressableJavaTypeDescriptor().getJdbcRecommendedSqlType( getCurrentBaseSqlTypeIndicators() ) );
} }
public static TemporalType getSqlTemporalType(MappingModelExpressable type) { public static TemporalType getSqlTemporalType(MappingModelExpressable<?> type) {
if ( type instanceof BasicValuedMapping ) { if ( type instanceof BasicValuedMapping ) {
return getSqlTemporalType( ( (BasicValuedMapping) type ).getJdbcMapping().getSqlTypeDescriptor() ); return getSqlTemporalType( ( (BasicValuedMapping) type ).getJdbcMapping().getSqlTypeDescriptor() );
} }
else if (type instanceof SingleColumnType) { else if (type instanceof SingleColumnType) {
return getSqlTemporalType( ((SingleColumnType) type).sqlType() ); return getSqlTemporalType( ((SingleColumnType<?>) type).sqlType() );
} }
return null; return null;
} }

View File

@ -369,12 +369,12 @@ private <T> SelectStatement buildSqlSelectAst(
final HqlQueryImplementor<String> hqlQuery = (HqlQueryImplementor<String>) query; final HqlQueryImplementor<String> hqlQuery = (HqlQueryImplementor<String>) query;
hqlQuery.applyGraph( entityGraph, mode ); hqlQuery.applyGraph( entityGraph, mode );
final SqmSelectStatement sqmStatement = (SqmSelectStatement) hqlQuery.getSqmStatement(); final SqmSelectStatement<String> sqmStatement = (SqmSelectStatement<String>) hqlQuery.getSqmStatement();
final StandardSqmTranslator<SelectStatement> sqmConverter = new StandardSqmTranslator<>( final StandardSqmTranslator<SelectStatement> sqmConverter = new StandardSqmTranslator<>(
sqmStatement, sqmStatement,
hqlQuery.getQueryOptions(), hqlQuery.getQueryOptions(),
( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), ( (QuerySqmImpl<?>) hqlQuery ).getDomainParameterXref(),
query.getParameterBindings(), query.getParameterBindings(),
loadQueryInfluencers, loadQueryInfluencers,
session.getSessionFactory() session.getSessionFactory()

View File

@ -365,12 +365,12 @@ private <T> SelectStatement buildSqlSelectAst(
final HqlQueryImplementor<String> hqlQuery = (HqlQueryImplementor<String>) query; final HqlQueryImplementor<String> hqlQuery = (HqlQueryImplementor<String>) query;
hqlQuery.applyGraph( entityGraph, mode ); hqlQuery.applyGraph( entityGraph, mode );
final SqmSelectStatement sqmStatement = (SqmSelectStatement) hqlQuery.getSqmStatement(); final SqmSelectStatement<String> sqmStatement = (SqmSelectStatement<String>) hqlQuery.getSqmStatement();
final StandardSqmTranslator<SelectStatement> sqmConverter = new StandardSqmTranslator<>( final StandardSqmTranslator<SelectStatement> sqmConverter = new StandardSqmTranslator<>(
sqmStatement, sqmStatement,
hqlQuery.getQueryOptions(), hqlQuery.getQueryOptions(),
( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), ( (QuerySqmImpl<?>) hqlQuery ).getDomainParameterXref(),
query.getParameterBindings(), query.getParameterBindings(),
loadQueryInfluencers, loadQueryInfluencers,
session.getSessionFactory() session.getSessionFactory()

View File

@ -56,7 +56,7 @@ public void testHqlTranslationNoSessionFactory(DomainModelScope modelScope, Serv
final String hql = "select a from SalesAssociate a"; final String hql = "select a from SalesAssociate a";
final HqlTranslator hqlTranslator = buildHqlTranslator( modelScope, registryScope ); final HqlTranslator hqlTranslator = buildHqlTranslator( modelScope, registryScope );
final SqmStatement sqmStatement = hqlTranslator.translate( hql ); final SqmStatement<?> sqmStatement = hqlTranslator.translate( hql );
assert sqmStatement != null; assert sqmStatement != null;
} }

View File

@ -89,9 +89,9 @@ public void testDuplicateIdentificationVariableCollision() {
@Test @Test
public void testSameIdentificationVariablesInSubquery() { public void testSameIdentificationVariablesInSubquery() {
final String query = "select a from SimpleEntity a where a.someString in (select a.someString from SimpleEntity a where a.someInteger = 5)"; final String query = "select a from SimpleEntity a where a.someString in (select a.someString from SimpleEntity a where a.someInteger = 5)";
final SqmSelectStatement sqm = interpretSelect( query ); final SqmSelectStatement<?> sqm = interpretSelect( query );
final SqmQuerySpec querySpec = sqm.getQuerySpec(); final SqmQuerySpec<?> querySpec = sqm.getQuerySpec();
final List<SqmSelection> selections = querySpec.getSelectClause().getSelections(); final List<SqmSelection> selections = querySpec.getSelectClause().getSelections();
assertThat( selections, hasSize( 1 ) ); assertThat( selections, hasSize( 1 ) );
@ -118,9 +118,9 @@ public void testSameIdentificationVariablesInSubquery() {
public void testSubqueryUsingIdentificationVariableDefinedInRootQuery() { public void testSubqueryUsingIdentificationVariableDefinedInRootQuery() {
final String query = "select a from SimpleEntity a where a.someString in " + final String query = "select a from SimpleEntity a where a.someString in " +
"( select b.someString from SimpleEntity b where a.someLong = b.someLong )"; "( select b.someString from SimpleEntity b where a.someLong = b.someLong )";
final SqmSelectStatement sqm = interpretSelect( query ); final SqmSelectStatement<?> sqm = interpretSelect( query );
final SqmQuerySpec querySpec = sqm.getQuerySpec(); final SqmQuerySpec<?> querySpec = sqm.getQuerySpec();
final List<SqmSelection> selections = querySpec.getSelectClause().getSelections(); final List<SqmSelection> selections = querySpec.getSelectClause().getSelections();
assertThat( selections, hasSize( 1 ) ); assertThat( selections, hasSize( 1 ) );

View File

@ -47,7 +47,7 @@ protected Class[] getAnnotatedClasses() {
@Test @Test
public void testImplicitJoinReuse() { public void testImplicitJoinReuse() {
final SqmSelectStatement statement = interpretSelect( "select s.mate.dob, s.mate.numberOfToes from Person s" ); final SqmSelectStatement<?> statement = interpretSelect( "select s.mate.dob, s.mate.numberOfToes from Person s" );
assertThat( statement.getQuerySpec().getFromClause().getRoots().size(), is(1) ); assertThat( statement.getQuerySpec().getFromClause().getRoots().size(), is(1) );
final SqmRoot<?> sqmRoot = statement.getQuerySpec().getFromClause().getRoots().get( 0 ); final SqmRoot<?> sqmRoot = statement.getQuerySpec().getFromClause().getRoots().get( 0 );
@ -75,7 +75,7 @@ private void assertPropertyPath(SqmExpression expression, String expectedFullPat
@Test @Test
public void testImplicitJoinReuse2() { public void testImplicitJoinReuse2() {
final SqmSelectStatement statement = interpretSelect( "select s.mate from Person s where s.mate.dob = ?1" ); final SqmSelectStatement<?> statement = interpretSelect( "select s.mate from Person s where s.mate.dob = ?1" );
assertThat( statement.getQuerySpec().getFromClause().getRoots().size(), is(1) ); assertThat( statement.getQuerySpec().getFromClause().getRoots().size(), is(1) );
final SqmRoot<?> sqmRoot = statement.getQuerySpec().getFromClause().getRoots().get( 0 ); final SqmRoot<?> sqmRoot = statement.getQuerySpec().getFromClause().getRoots().get( 0 );
@ -114,20 +114,20 @@ public void testEntityIdReferences() {
.entity( OddOne.class ); .entity( OddOne.class );
final SingularPersistentAttribute<OddOne, ?> idAttribute = entity.findIdAttribute(); final SingularPersistentAttribute<OddOne, ?> idAttribute = entity.findIdAttribute();
final SqmSelectStatement sqmSelectStatement = interpretSelect( "select s.id from OddOne s where s.pk = ?1" ); final SqmSelectStatement<?> sqmSelectStatement = interpretSelect( "select s.id from OddOne s where s.pk = ?1" );
final SqmQuerySpec querySpec = sqmSelectStatement.getQuerySpec(); final SqmQuerySpec<?> querySpec = sqmSelectStatement.getQuerySpec();
assertThat( querySpec.getSelectClause().getSelections().size(), is(1) ); assertThat( querySpec.getSelectClause().getSelections().size(), is(1) );
final SqmSelection sqmSelection = querySpec.getSelectClause().getSelections().get( 0 ); final SqmSelection<?> sqmSelection = querySpec.getSelectClause().getSelections().get( 0 );
assertThat( sqmSelection.getSelectableNode(), not( sameInstance( idAttribute ) ) ); assertThat( sqmSelection.getSelectableNode(), not( sameInstance( idAttribute ) ) );
final SqmExpression<?> pkRef = ( (SqmComparisonPredicate) querySpec.getRestriction() ).getLeftHandExpression(); final SqmExpression<?> pkRef = ( (SqmComparisonPredicate) querySpec.getRestriction() ).getLeftHandExpression();
assertThat( ( (SqmPath) pkRef ).getJavaType(), sameInstance( String.class ) ); assertThat( ( (SqmPath<?>) pkRef ).getJavaType(), sameInstance( String.class ) );
} }
@Test @Test
public void testCanonicalReferences() { public void testCanonicalReferences() {
final SqmSelectStatement sqm = interpretSelect( "select s.mate from Person s where id(s) = ?1" ); final SqmSelectStatement<?> sqm = interpretSelect( "select s.mate from Person s where id(s) = ?1" );
assertThat( sqm.getQuerySpec().getRestriction(), notNullValue() ); assertThat( sqm.getQuerySpec().getRestriction(), notNullValue() );
final SqmComparisonPredicate restriction = (SqmComparisonPredicate) sqm.getQuerySpec().getRestriction(); final SqmComparisonPredicate restriction = (SqmComparisonPredicate) sqm.getQuerySpec().getRestriction();
assertThat( restriction, notNullValue() ); assertThat( restriction, notNullValue() );
@ -135,11 +135,11 @@ public void testCanonicalReferences() {
@Test @Test
public void testManyToOneReference() { public void testManyToOneReference() {
final SqmSelectStatement sqm = interpretSelect( "select s.mate from Person s" ); final SqmSelectStatement<?> sqm = interpretSelect( "select s.mate from Person s" );
final List<SqmSelection> selections = sqm.getQuerySpec().getSelectClause().getSelections(); final List<SqmSelection> selections = sqm.getQuerySpec().getSelectClause().getSelections();
assertThat( selections.size(), is( 1 ) ); assertThat( selections.size(), is( 1 ) );
final SqmSelection selection = selections.get( 0 ); final SqmSelection<?> selection = selections.get( 0 );
final SqmSelectableNode selectableNode = selection.getSelectableNode(); final SqmSelectableNode<?> selectableNode = selection.getSelectableNode();
assert Person.class.equals( selectableNode.getJavaTypeDescriptor().getJavaType() ); assert Person.class.equals( selectableNode.getJavaTypeDescriptor().getJavaType() );
} }

View File

@ -40,7 +40,7 @@ protected Class[] getAnnotatedClasses() {
@Test @Test
public void testBasicSimpleCaseExpression() { public void testBasicSimpleCaseExpression() {
SqmSelectStatement select = interpretSelect( SqmSelectStatement<?> select = interpretSelect(
"select p from Person p where p.numberOfToes = case p.dob when ?1 then 6 else 8 end" "select p from Person p where p.numberOfToes = case p.dob when ?1 then 6 else 8 end"
); );
@ -65,7 +65,7 @@ public void testBasicSimpleCaseExpression() {
@Test @Test
public void testBasicSearchedCaseExpression() { public void testBasicSearchedCaseExpression() {
SqmSelectStatement select = interpretSelect( SqmSelectStatement<?> select = interpretSelect(
"select p from Person p where p.numberOfToes = case when p.dob = ?1 then 6 else 8 end" "select p from Person p where p.numberOfToes = case when p.dob = ?1 then 6 else 8 end"
); );
@ -87,7 +87,7 @@ public void testBasicSearchedCaseExpression() {
@Test @Test
public void testBasicCoalesceExpression() { public void testBasicCoalesceExpression() {
SqmSelectStatement select = interpretSelect( SqmSelectStatement<?> select = interpretSelect(
"select coalesce(p.nickName, p.mate.nickName) from Person p" "select coalesce(p.nickName, p.mate.nickName) from Person p"
); );
@ -104,7 +104,7 @@ public void testBasicCoalesceExpression() {
@Test @Test
public void testBasicNullifExpression() { public void testBasicNullifExpression() {
SqmSelectStatement select = interpretSelect( SqmSelectStatement<?> select = interpretSelect(
"select nullif(p.nickName, p.mate.nickName) from Person p" "select nullif(p.nickName, p.mate.nickName) from Person p"
); );

View File

@ -45,7 +45,7 @@ protected Class[] getAnnotatedClasses() {
@Test @Test
public void testSimpleDynamicInstantiationSelection() { public void testSimpleDynamicInstantiationSelection() {
SqmSelectStatement statement = interpretSelect( SqmSelectStatement<?> statement = interpretSelect(
"select new org.hibernate.orm.test.query.sqm.domain.ConstructedLookupListItem( e.id, e.theString ) from EntityOfBasics e" "select new org.hibernate.orm.test.query.sqm.domain.ConstructedLookupListItem( e.id, e.theString ) from EntityOfBasics e"
); );
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
@ -62,7 +62,7 @@ public void testSimpleDynamicInstantiationSelection() {
@Test @Test
public void testMultipleDynamicInstantiationSelection() { public void testMultipleDynamicInstantiationSelection() {
SqmSelectStatement statement = interpretSelect( SqmSelectStatement<?> statement = interpretSelect(
"select new org.hibernate.orm.test.query.sqm.domain.ConstructedLookupListItem( e.id, e.theString ), " + "select new org.hibernate.orm.test.query.sqm.domain.ConstructedLookupListItem( e.id, e.theString ), " +
"new org.hibernate.orm.test.query.sqm.domain.ConstructedLookupListItem( e.id, e.theString ) " + "new org.hibernate.orm.test.query.sqm.domain.ConstructedLookupListItem( e.id, e.theString ) " +
"from EntityOfBasics e" "from EntityOfBasics e"
@ -99,7 +99,7 @@ public void testMultipleDynamicInstantiationSelection() {
@Test @Test
public void testMixedAttributeAndDynamicInstantiationSelection() { public void testMixedAttributeAndDynamicInstantiationSelection() {
SqmSelectStatement statement = interpretSelect( SqmSelectStatement<?> statement = interpretSelect(
"select new org.hibernate.orm.test.query.sqm.domain.ConstructedLookupListItem( e.id, e.theString ), e.theInteger from EntityOfBasics e" "select new org.hibernate.orm.test.query.sqm.domain.ConstructedLookupListItem( e.id, e.theString ), e.theInteger from EntityOfBasics e"
); );
assertEquals( 2, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 2, statement.getQuerySpec().getSelectClause().getSelections().size() );
@ -117,7 +117,7 @@ public void testMixedAttributeAndDynamicInstantiationSelection() {
assertThat( instantiation.getArguments(), hasSize( 2 ) ); assertThat( instantiation.getArguments(), hasSize( 2 ) );
final SqmPath theIntegerPath = TestingUtil.cast( final SqmPath<?> theIntegerPath = TestingUtil.cast(
statement.getQuerySpec().getSelectClause().getSelections().get( 1 ).getSelectableNode(), statement.getQuerySpec().getSelectClause().getSelections().get( 1 ).getSelectableNode(),
SqmPath.class SqmPath.class
); );
@ -127,7 +127,7 @@ public void testMixedAttributeAndDynamicInstantiationSelection() {
@Test @Test
public void testNestedDynamicInstantiationSelection() { public void testNestedDynamicInstantiationSelection() {
SqmSelectStatement statement = interpretSelect( SqmSelectStatement<?> statement = interpretSelect(
"select new org.hibernate.orm.test.query.sqm.domain.NestedCtorLookupListItem(" + "select new org.hibernate.orm.test.query.sqm.domain.NestedCtorLookupListItem(" +
" e.id, " + " e.id, " +
" e.theString, " + " e.theString, " +
@ -154,7 +154,7 @@ public void testNestedDynamicInstantiationSelection() {
); );
assertThat( firstArg.getReferencedPathSource().getPathName(), is( "id" ) ); assertThat( firstArg.getReferencedPathSource().getPathName(), is( "id" ) );
final SqmPath secondArg = TestingUtil.cast( final SqmPath<?> secondArg = TestingUtil.cast(
instantiation.getArguments().get( 1 ).getSelectableNode(), instantiation.getArguments().get( 1 ).getSelectableNode(),
SqmPath.class SqmPath.class
); );
@ -175,7 +175,7 @@ public void testNestedDynamicInstantiationSelection() {
@Test @Test
public void testSimpleDynamicListInstantiation() { public void testSimpleDynamicListInstantiation() {
SqmSelectStatement statement = interpretSelect( "select new list( e.id, e.theString ) from EntityOfBasics e" ); SqmSelectStatement<?> statement = interpretSelect( "select new list( e.id, e.theString ) from EntityOfBasics e" );
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
final SqmDynamicInstantiation<?> instantiation = TestingUtil.cast( final SqmDynamicInstantiation<?> instantiation = TestingUtil.cast(
@ -208,7 +208,7 @@ public void testSimpleDynamicListInstantiation() {
@Test @Test
public void testSimpleDynamicMapInstantiation() { public void testSimpleDynamicMapInstantiation() {
SqmSelectStatement statement = interpretSelect( "select new map( e.id as id, e.theString as ts ) from EntityOfBasics e" ); SqmSelectStatement<?> statement = interpretSelect( "select new map( e.id as id, e.theString as ts ) from EntityOfBasics e" );
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
final SqmDynamicInstantiation<?> instantiation = TestingUtil.cast( final SqmDynamicInstantiation<?> instantiation = TestingUtil.cast(
@ -245,7 +245,7 @@ public void testSimpleInjectedInstantiation() {
// todo (6.0) : this should blow up as early as possible - no aliases for bean-injection-based dynamic-instantiation // todo (6.0) : this should blow up as early as possible - no aliases for bean-injection-based dynamic-instantiation
// atm this does not fail until later when building the SQL AST // atm this does not fail until later when building the SQL AST
SqmSelectStatement statement = interpretSelect( SqmSelectStatement<?> statement = interpretSelect(
"select new org.hibernate.orm.test.query.sqm.domain.InjectedLookupListItem( e.id, e.theString ) from EntityOfBasics e" "select new org.hibernate.orm.test.query.sqm.domain.InjectedLookupListItem( e.id, e.theString ) from EntityOfBasics e"
); );
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );

View File

@ -47,7 +47,7 @@ protected Class[] getAnnotatedClasses() {
@Test @Test
public void testSimpleFrom() { public void testSimpleFrom() {
final SqmSelectStatement selectStatement = interpretSelect( "select p.nickName from Person p" ); final SqmSelectStatement<?> selectStatement = interpretSelect( "select p.nickName from Person p" );
final SqmFromClause fromClause = selectStatement.getQuerySpec().getFromClause(); final SqmFromClause fromClause = selectStatement.getQuerySpec().getFromClause();
assertThat( fromClause, notNullValue() ); assertThat( fromClause, notNullValue() );
@ -61,7 +61,7 @@ public void testSimpleFrom() {
@Test @Test
public void testMultipleSpaces() { public void testMultipleSpaces() {
final SqmSelectStatement selectStatement = interpretSelect( final SqmSelectStatement<?> selectStatement = interpretSelect(
"select p.nickName from Person p, Person p2" "select p.nickName from Person p, Person p2"
); );
@ -85,7 +85,7 @@ public void testMultipleSpaces() {
@Test @Test
public void testImplicitAlias() { public void testImplicitAlias() {
final SqmSelectStatement selectStatement = interpretSelect( "select nickName from Person" ); final SqmSelectStatement<?> selectStatement = interpretSelect( "select nickName from Person" );
final SqmFromClause fromClause = selectStatement.getQuerySpec().getFromClause(); final SqmFromClause fromClause = selectStatement.getQuerySpec().getFromClause();
assertThat( fromClause, notNullValue() ); assertThat( fromClause, notNullValue() );
@ -99,7 +99,7 @@ public void testImplicitAlias() {
@Test @Test
public void testCrossJoin() { public void testCrossJoin() {
final SqmSelectStatement selectStatement = interpretSelect( final SqmSelectStatement<?> selectStatement = interpretSelect(
"select p.nickName from Person p cross join Person p2" "select p.nickName from Person p cross join Person p2"
); );
@ -125,7 +125,7 @@ public void testSimpleImplicitInnerJoin() {
} }
private void simpleJoinAssertions( private void simpleJoinAssertions(
SqmSelectStatement selectStatement, SqmSelectStatement<?> selectStatement,
SqmJoinType joinType, SqmJoinType joinType,
String rootAlias, String rootAlias,
String joinAlias) { String joinAlias) {
@ -174,7 +174,7 @@ public void testSimpleExplicitLeftOuterJoin() {
@Test @Test
public void testAttributeJoinWithOnClause() { public void testAttributeJoinWithOnClause() {
final SqmSelectStatement selectStatement = interpretSelect( final SqmSelectStatement<?> selectStatement = interpretSelect(
"select a from Person a left outer join a.mate c on c.numberOfToes > 5 and c.numberOfToes < 20 " "select a from Person a left outer join a.mate c on c.numberOfToes > 5 and c.numberOfToes < 20 "
); );
@ -199,7 +199,7 @@ public void testAttributeJoinWithOnClause() {
@Test @Test
public void testPathExpression() { public void testPathExpression() {
final String query = "select p.mate from Person p"; final String query = "select p.mate from Person p";
SqmSelectStatement selectStatement = interpretSelect( query ); SqmSelectStatement<?> selectStatement = interpretSelect( query );
final SqmFromClause fromClause = selectStatement.getQuerySpec().getFromClause(); final SqmFromClause fromClause = selectStatement.getQuerySpec().getFromClause();
@ -215,7 +215,7 @@ public void testPathExpression() {
@Test @Test
public void testFromElementReferenceInSelect() { public void testFromElementReferenceInSelect() {
final String query = "select p from Person p"; final String query = "select p from Person p";
SqmSelectStatement selectStatement = interpretSelect( query ); SqmSelectStatement<?> selectStatement = interpretSelect( query );
final SqmFromClause fromClause = selectStatement.getQuerySpec().getFromClause(); final SqmFromClause fromClause = selectStatement.getQuerySpec().getFromClause();
assertThat( fromClause, notNullValue() ); assertThat( fromClause, notNullValue() );
@ -225,7 +225,7 @@ public void testFromElementReferenceInSelect() {
assertThat( sqmRoot, notNullValue() ); assertThat( sqmRoot, notNullValue() );
assertThat( selectStatement.getQuerySpec().getSelectClause().getSelections(), hasSize( 1 ) ); assertThat( selectStatement.getQuerySpec().getSelectClause().getSelections(), hasSize( 1 ) );
final SqmSelection sqmSelection = selectStatement.getQuerySpec().getSelectClause().getSelections().get( 0 ); final SqmSelection<?> sqmSelection = selectStatement.getQuerySpec().getSelectClause().getSelections().get( 0 );
assertThat( sqmSelection.getSelectableNode(), instanceOf( SqmRoot.class ) ); assertThat( sqmSelection.getSelectableNode(), instanceOf( SqmRoot.class ) );
} }
@ -233,7 +233,7 @@ public void testFromElementReferenceInSelect() {
@Test @Test
public void testFromElementReferenceInOrderBy() { public void testFromElementReferenceInOrderBy() {
final String query = "select p from Person p order by p"; final String query = "select p from Person p order by p";
SqmSelectStatement selectStatement = interpretSelect( query ); SqmSelectStatement<?> selectStatement = interpretSelect( query );
final SqmFromClause fromClause = selectStatement.getQuerySpec().getFromClause(); final SqmFromClause fromClause = selectStatement.getQuerySpec().getFromClause();
assertThat( fromClause, notNullValue() ); assertThat( fromClause, notNullValue() );

View File

@ -33,7 +33,7 @@
public class MutationTests { public class MutationTests {
@Test @Test
public void testSimpleDeleteTranslation(SessionFactoryScope scope) { public void testSimpleDeleteTranslation(SessionFactoryScope scope) {
final SqmDeleteStatement sqmDelete = (SqmDeleteStatement) scope.getSessionFactory() final SqmDeleteStatement<?> sqmDelete = (SqmDeleteStatement<?>) scope.getSessionFactory()
.getQueryEngine() .getQueryEngine()
.getHqlTranslator() .getHqlTranslator()
.translate( "delete BasicEntity" ); .translate( "delete BasicEntity" );
@ -45,7 +45,7 @@ public void testSimpleDeleteTranslation(SessionFactoryScope scope) {
@Test @Test
public void testSimpleRestrictedDeleteTranslation(SessionFactoryScope scope) { public void testSimpleRestrictedDeleteTranslation(SessionFactoryScope scope) {
final SqmDeleteStatement sqmDelete = (SqmDeleteStatement) scope.getSessionFactory() final SqmDeleteStatement<?> sqmDelete = (SqmDeleteStatement<?>) scope.getSessionFactory()
.getQueryEngine() .getQueryEngine()
.getHqlTranslator() .getHqlTranslator()
.translate( "delete BasicEntity where data = 'abc'" ); .translate( "delete BasicEntity where data = 'abc'" );

View File

@ -82,7 +82,7 @@ public void testParameterCollection() {
@Test @Test
public void testAllowMultiValuedBinding() { public void testAllowMultiValuedBinding() {
final SqmSelectStatement<?> sqm = interpretSelect( "select a.nickName from Person a where a.numberOfToes in (?1)" ); final SqmSelectStatement<?> sqm = interpretSelect( "select a.nickName from Person a where a.numberOfToes in (?1)" );
final SqmParameter parameter = sqm.getSqmParameters().iterator().next(); final SqmParameter<?> parameter = sqm.getSqmParameters().iterator().next();
assertThat( parameter.allowMultiValuedBinding(), is(true) ); assertThat( parameter.allowMultiValuedBinding(), is(true) );
} }

View File

@ -54,23 +54,23 @@ public class SelectClauseTests extends BaseSqmUnitTest {
@Test @Test
public void testSimpleAliasSelection() { public void testSimpleAliasSelection() {
SqmSelectStatement statement = interpretSelect( "select p from Person p" ); SqmSelectStatement<?> statement = interpretSelect( "select p from Person p" );
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
SqmSelection selection = statement.getQuerySpec().getSelectClause().getSelections().get( 0 ); SqmSelection<?> selection = statement.getQuerySpec().getSelectClause().getSelections().get( 0 );
assertThat( selection.getSelectableNode(), instanceOf( SqmRoot.class ) ); assertThat( selection.getSelectableNode(), instanceOf( SqmRoot.class ) );
} }
@Test @Test
public void testSimpleAttributeSelection() { public void testSimpleAttributeSelection() {
SqmSelectStatement statement = interpretSelect( "select p.nickName from Person p" ); SqmSelectStatement<?> statement = interpretSelect( "select p.nickName from Person p" );
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
SqmSelection selection = statement.getQuerySpec().getSelectClause().getSelections().get( 0 ); SqmSelection<?> selection = statement.getQuerySpec().getSelectClause().getSelections().get( 0 );
assertThat( selection.getSelectableNode(), instanceOf( SqmSimplePath.class ) ); assertThat( selection.getSelectableNode(), instanceOf( SqmSimplePath.class ) );
} }
@Test @Test
public void testCompoundAttributeSelection() { public void testCompoundAttributeSelection() {
SqmSelectStatement statement = interpretSelect( "select p.nickName, p.name.firstName from Person p" ); SqmSelectStatement<?> statement = interpretSelect( "select p.nickName, p.name.firstName from Person p" );
assertEquals( 2, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 2, statement.getQuerySpec().getSelectClause().getSelections().size() );
assertThat( assertThat(
statement.getQuerySpec().getSelectClause().getSelections().get( 0 ).getSelectableNode(), statement.getQuerySpec().getSelectClause().getSelections().get( 0 ).getSelectableNode(),
@ -84,7 +84,7 @@ public void testCompoundAttributeSelection() {
@Test @Test
public void testMixedAliasAndAttributeSelection() { public void testMixedAliasAndAttributeSelection() {
SqmSelectStatement statement = interpretSelect( "select p, p.nickName from Person p" ); SqmSelectStatement<?> statement = interpretSelect( "select p, p.nickName from Person p" );
assertEquals( 2, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 2, statement.getQuerySpec().getSelectClause().getSelections().size() );
assertThat( assertThat(
statement.getQuerySpec().getSelectClause().getSelections().get( 0 ).getSelectableNode(), statement.getQuerySpec().getSelectClause().getSelections().get( 0 ).getSelectableNode(),
@ -99,10 +99,10 @@ public void testMixedAliasAndAttributeSelection() {
@Test @Test
public void testBinaryArithmeticExpression() { public void testBinaryArithmeticExpression() {
final String query = "select p.numberOfToes + p.numberOfToes as b from Person p"; final String query = "select p.numberOfToes + p.numberOfToes as b from Person p";
final SqmSelectStatement selectStatement = interpretSelect( query ); final SqmSelectStatement<?> selectStatement = interpretSelect( query );
final SqmQuerySpec querySpec = selectStatement.getQuerySpec(); final SqmQuerySpec<?> querySpec = selectStatement.getQuerySpec();
final SqmSelection selection = querySpec.getSelectClause().getSelections().get( 0 ); final SqmSelection<?> selection = querySpec.getSelectClause().getSelections().get( 0 );
assertThat( querySpec.getFromClause().getRoots().size(), is(1) ); assertThat( querySpec.getFromClause().getRoots().size(), is(1) );
final SqmRoot<?> root = querySpec.getFromClause().getRoots().get( 0 ); final SqmRoot<?> root = querySpec.getFromClause().getRoots().get( 0 );
@ -110,12 +110,12 @@ public void testBinaryArithmeticExpression() {
assertThat( root.getJoins().size(), is(0) ); assertThat( root.getJoins().size(), is(0) );
SqmBinaryArithmetic expression = (SqmBinaryArithmetic) selection.getSelectableNode(); SqmBinaryArithmetic expression = (SqmBinaryArithmetic) selection.getSelectableNode();
SqmPath leftHandOperand = (SqmPath) expression.getLeftHandOperand(); SqmPath<?> leftHandOperand = (SqmPath<?>) expression.getLeftHandOperand();
assertThat( leftHandOperand.getLhs(), sameInstance( root ) ); assertThat( leftHandOperand.getLhs(), sameInstance( root ) );
assertThat( leftHandOperand.getReferencedPathSource().getPathName(), is( "numberOfToes" ) ); assertThat( leftHandOperand.getReferencedPathSource().getPathName(), is( "numberOfToes" ) );
// assertThat( leftHandOperand.getFromElement(), nullValue() ); // assertThat( leftHandOperand.getFromElement(), nullValue() );
SqmPath rightHandOperand = (SqmPath) expression.getRightHandOperand(); SqmPath<?> rightHandOperand = (SqmPath<?>) expression.getRightHandOperand();
assertThat( rightHandOperand.getLhs(), sameInstance( root ) ); assertThat( rightHandOperand.getLhs(), sameInstance( root ) );
assertThat( rightHandOperand.getReferencedPathSource().getPathName(), is( "numberOfToes" ) ); assertThat( rightHandOperand.getReferencedPathSource().getPathName(), is( "numberOfToes" ) );
// assertThat( leftHandOperand.getFromElement(), nullValue() ); // assertThat( leftHandOperand.getFromElement(), nullValue() );
@ -124,10 +124,10 @@ public void testBinaryArithmeticExpression() {
@Test @Test
public void testBinaryArithmeticExpressionWithMultipleFromSpaces() { public void testBinaryArithmeticExpressionWithMultipleFromSpaces() {
final String query = "select p.numberOfToes + p2.numberOfToes as b from Person p, Person p2"; final String query = "select p.numberOfToes + p2.numberOfToes as b from Person p, Person p2";
final SqmSelectStatement selectStatement = interpretSelect( query ); final SqmSelectStatement<?> selectStatement = interpretSelect( query );
final SqmQuerySpec querySpec = selectStatement.getQuerySpec(); final SqmQuerySpec<?> querySpec = selectStatement.getQuerySpec();
final SqmSelection selection = querySpec.getSelectClause().getSelections().get( 0 ); final SqmSelection<?> selection = querySpec.getSelectClause().getSelections().get( 0 );
assertThat( querySpec.getFromClause().getRoots().size(), is(2) ); assertThat( querySpec.getFromClause().getRoots().size(), is(2) );
@ -139,11 +139,11 @@ public void testBinaryArithmeticExpressionWithMultipleFromSpaces() {
SqmBinaryArithmetic addExpression = (SqmBinaryArithmetic) selection.getSelectableNode(); SqmBinaryArithmetic addExpression = (SqmBinaryArithmetic) selection.getSelectableNode();
SqmPath leftHandOperand = (SqmPath) addExpression.getLeftHandOperand(); SqmPath<?> leftHandOperand = (SqmPath<?>) addExpression.getLeftHandOperand();
assertThat( leftHandOperand.getLhs(), sameInstance( entityRoot ) ); assertThat( leftHandOperand.getLhs(), sameInstance( entityRoot ) );
assertThat( leftHandOperand.getReferencedPathSource().getPathName(), is( "numberOfToes" ) ); assertThat( leftHandOperand.getReferencedPathSource().getPathName(), is( "numberOfToes" ) );
SqmPath rightHandOperand = (SqmPath) addExpression.getRightHandOperand(); SqmPath<?> rightHandOperand = (SqmPath<?>) addExpression.getRightHandOperand();
assertThat( rightHandOperand.getLhs(), sameInstance( entity2Root ) ); assertThat( rightHandOperand.getLhs(), sameInstance( entity2Root ) );
assertThat( rightHandOperand.getReferencedPathSource().getPathName(), is( "numberOfToes" ) ); assertThat( rightHandOperand.getReferencedPathSource().getPathName(), is( "numberOfToes" ) );
} }
@ -165,20 +165,20 @@ public void testMapKeyFunction() {
} }
private void collectionIndexFunctionAssertions( private void collectionIndexFunctionAssertions(
SqmSelectStatement statement, SqmSelectStatement<?> statement,
CollectionClassification expectedCollectionClassification, CollectionClassification expectedCollectionClassification,
Class<? extends SimpleDomainType> expectedIndexDomainTypeType, Class<? extends SimpleDomainType> expectedIndexDomainTypeType,
String expectedAlias) { String expectedAlias) {
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
final SqmSelectableNode selectedExpr = statement.getQuerySpec() final SqmSelectableNode<?> selectedExpr = statement.getQuerySpec()
.getSelectClause() .getSelectClause()
.getSelections() .getSelections()
.get( 0 ) .get( 0 )
.getSelectableNode(); .getSelectableNode();
assertThat( selectedExpr, instanceOf( SqmSimplePath.class ) ); assertThat( selectedExpr, instanceOf( SqmSimplePath.class ) );
final SqmSimplePath selectedPath = (SqmSimplePath) selectedExpr; final SqmSimplePath<?> selectedPath = (SqmSimplePath<?>) selectedExpr;
assertThat( selectedPath.getLhs().getExplicitAlias(), is( expectedAlias ) ); assertThat( selectedPath.getLhs().getExplicitAlias(), is( expectedAlias ) );
@ -257,20 +257,20 @@ public void testCollectionValueFunction() {
} }
private void collectionValueFunctionAssertions( private void collectionValueFunctionAssertions(
SqmSelectStatement statement, SqmSelectStatement<?> statement,
String collectionRole, String collectionRole,
String collectionIdentificationVariable) { String collectionIdentificationVariable) {
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
final SqmSelectableNode selectedExpression = statement.getQuerySpec() final SqmSelectableNode<?> selectedExpression = statement.getQuerySpec()
.getSelectClause() .getSelectClause()
.getSelections() .getSelections()
.get( 0 ) .get( 0 )
.getSelectableNode(); .getSelectableNode();
assertThat( selectedExpression, instanceOf( SqmPath.class ) ); assertThat( selectedExpression, instanceOf( SqmPath.class ) );
final SqmPath selectedPath = (SqmPath) selectedExpression; final SqmPath<?> selectedPath = (SqmPath<?>) selectedExpression;
final SqmPathSource referencedPathSource = selectedPath.getReferencedPathSource(); final SqmPathSource<?> referencedPathSource = selectedPath.getReferencedPathSource();
final String ownerName = StringHelper.qualifier( collectionRole ); final String ownerName = StringHelper.qualifier( collectionRole );
final String attributeName = StringHelper.unqualify( collectionRole ); final String attributeName = StringHelper.unqualify( collectionRole );
@ -289,7 +289,7 @@ public void testMapEntryFunction() {
testMapEntryFunctionAssertions( interpretSelect( "select entry(m) from EntityOfMaps e join e.sortedManyToManyByBasic m" ) ); testMapEntryFunctionAssertions( interpretSelect( "select entry(m) from EntityOfMaps e join e.sortedManyToManyByBasic m" ) );
} }
private void testMapEntryFunctionAssertions(SqmSelectStatement statement) { private void testMapEntryFunctionAssertions(SqmSelectStatement<?> statement) {
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
final SqmMapEntryReference mapEntryPath = (SqmMapEntryReference) statement.getQuerySpec() final SqmMapEntryReference mapEntryPath = (SqmMapEntryReference) statement.getQuerySpec()
@ -300,16 +300,16 @@ private void testMapEntryFunctionAssertions(SqmSelectStatement statement) {
assertThat( mapEntryPath.getJavaTypeDescriptor().getJavaType(), is( equalTo( Map.Entry.class ) ) ); assertThat( mapEntryPath.getJavaTypeDescriptor().getJavaType(), is( equalTo( Map.Entry.class ) ) );
final SqmPath selectedPathLhs = mapEntryPath.getMapPath(); final SqmPath<?> selectedPathLhs = mapEntryPath.getMapPath();
assertThat( selectedPathLhs.getExplicitAlias(), is( "m" ) ); assertThat( selectedPathLhs.getExplicitAlias(), is( "m" ) );
} }
@Test @Test
public void testSimpleRootEntitySelection() { public void testSimpleRootEntitySelection() {
SqmSelectStatement statement = interpretSelect( "select e from EntityOfBasics e" ); SqmSelectStatement<?> statement = interpretSelect( "select e from EntityOfBasics e" );
assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, statement.getQuerySpec().getSelectClause().getSelections().size() );
final SqmPath sqmEntityReference = TestingUtil.cast( final SqmPath<?> sqmEntityReference = TestingUtil.cast(
statement.getQuerySpec().getSelectClause().getSelections().get( 0 ).getSelectableNode(), statement.getQuerySpec().getSelectClause().getSelections().get( 0 ).getSelectableNode(),
SqmPath.class SqmPath.class
); );

View File

@ -49,7 +49,7 @@ protected Class[] getAnnotatedClasses() {
@Test @Test
public void testIsNotNullPredicate() { public void testIsNotNullPredicate() {
SqmSelectStatement statement = interpretSelect( "select l from Person l where l.nickName is not null" ); SqmSelectStatement<?> statement = interpretSelect( "select l from Person l where l.nickName is not null" );
assertThat( statement.getQuerySpec().getWhereClause().getPredicate(), instanceOf( SqmNullnessPredicate.class ) ); assertThat( statement.getQuerySpec().getWhereClause().getPredicate(), instanceOf( SqmNullnessPredicate.class ) );
SqmNullnessPredicate predicate = (SqmNullnessPredicate) statement.getQuerySpec().getWhereClause().getPredicate(); SqmNullnessPredicate predicate = (SqmNullnessPredicate) statement.getQuerySpec().getWhereClause().getPredicate();
assertThat( predicate.isNegated(), is(true) ); assertThat( predicate.isNegated(), is(true) );
@ -57,7 +57,7 @@ public void testIsNotNullPredicate() {
@Test @Test
public void testNotIsNullPredicate() { public void testNotIsNullPredicate() {
SqmSelectStatement statement = interpretSelect( "select l from Person l where not l.nickName is null" ); SqmSelectStatement<?> statement = interpretSelect( "select l from Person l where not l.nickName is null" );
assertThat( statement.getQuerySpec().getWhereClause().getPredicate(), instanceOf( SqmNullnessPredicate.class ) ); assertThat( statement.getQuerySpec().getWhereClause().getPredicate(), instanceOf( SqmNullnessPredicate.class ) );
SqmNullnessPredicate predicate = (SqmNullnessPredicate) statement.getQuerySpec().getWhereClause().getPredicate(); SqmNullnessPredicate predicate = (SqmNullnessPredicate) statement.getQuerySpec().getWhereClause().getPredicate();
assertThat( predicate.isNegated(), is(true) ); assertThat( predicate.isNegated(), is(true) );
@ -65,7 +65,7 @@ public void testNotIsNullPredicate() {
@Test @Test
public void testNotIsNotNullPredicate() { public void testNotIsNotNullPredicate() {
SqmSelectStatement statement = interpretSelect( "select l from Person l where not l.nickName is not null" ); SqmSelectStatement<?> statement = interpretSelect( "select l from Person l where not l.nickName is not null" );
assertThat( statement.getQuerySpec().getWhereClause().getPredicate(), instanceOf( SqmNullnessPredicate.class ) ); assertThat( statement.getQuerySpec().getWhereClause().getPredicate(), instanceOf( SqmNullnessPredicate.class ) );
SqmNullnessPredicate predicate = (SqmNullnessPredicate) statement.getQuerySpec().getWhereClause().getPredicate(); SqmNullnessPredicate predicate = (SqmNullnessPredicate) statement.getQuerySpec().getWhereClause().getPredicate();
assertThat( predicate.isNegated(), is(false) ); assertThat( predicate.isNegated(), is(false) );
@ -73,7 +73,7 @@ public void testNotIsNotNullPredicate() {
@Test @Test
public void testCollectionSizeFunction() { public void testCollectionSizeFunction() {
SqmSelectStatement statement = interpretSelect( "SELECT t FROM EntityOfSets t WHERE SIZE( t.setOfBasics ) = 311" ); SqmSelectStatement<?> statement = interpretSelect( "SELECT t FROM EntityOfSets t WHERE SIZE( t.setOfBasics ) = 311" );
SqmPredicate predicate = statement.getQuerySpec().getWhereClause().getPredicate(); SqmPredicate predicate = statement.getQuerySpec().getWhereClause().getPredicate();
assertThat( predicate, instanceOf( SqmComparisonPredicate.class ) ); assertThat( predicate, instanceOf( SqmComparisonPredicate.class ) );
@ -82,7 +82,7 @@ public void testCollectionSizeFunction() {
assertThat( relationalPredicate.getSqmOperator(), is( ComparisonOperator.EQUAL ) ); assertThat( relationalPredicate.getSqmOperator(), is( ComparisonOperator.EQUAL ) );
assertThat( relationalPredicate.getRightHandExpression(), instanceOf( SqmLiteral.class ) ); assertThat( relationalPredicate.getRightHandExpression(), instanceOf( SqmLiteral.class ) );
assertThat( ( (SqmLiteral) relationalPredicate.getRightHandExpression() ).getLiteralValue(), is( 311 ) ); assertThat( ( (SqmLiteral<?>) relationalPredicate.getRightHandExpression() ).getLiteralValue(), is( 311 ) );
assertThat( relationalPredicate.getLeftHandExpression(), instanceOf( SqmCollectionSize.class ) ); assertThat( relationalPredicate.getLeftHandExpression(), instanceOf( SqmCollectionSize.class ) );
@ -93,7 +93,7 @@ public void testCollectionSizeFunction() {
@Test @Test
public void testListIndexFunction() { public void testListIndexFunction() {
SqmSelectStatement statement = interpretSelect( "select l from EntityOfLists t join t.listOfBasics l where index(l) > 2" ); SqmSelectStatement<?> statement = interpretSelect( "select l from EntityOfLists t join t.listOfBasics l where index(l) > 2" );
SqmPredicate predicate = statement.getQuerySpec().getWhereClause().getPredicate(); SqmPredicate predicate = statement.getQuerySpec().getWhereClause().getPredicate();
assertThat( predicate, instanceOf( SqmComparisonPredicate.class ) ); assertThat( predicate, instanceOf( SqmComparisonPredicate.class ) );
@ -102,10 +102,10 @@ public void testListIndexFunction() {
assertThat( relationalPredicate.getSqmOperator(), is( ComparisonOperator.GREATER_THAN ) ); assertThat( relationalPredicate.getSqmOperator(), is( ComparisonOperator.GREATER_THAN ) );
assertThat( relationalPredicate.getRightHandExpression(), instanceOf( SqmLiteral.class ) ); assertThat( relationalPredicate.getRightHandExpression(), instanceOf( SqmLiteral.class ) );
assertThat( ( (SqmLiteral) relationalPredicate.getRightHandExpression() ).getLiteralValue(), is( 2 ) ); assertThat( ( (SqmLiteral<?>) relationalPredicate.getRightHandExpression() ).getLiteralValue(), is( 2 ) );
assertThat( relationalPredicate.getLeftHandExpression(), instanceOf( SqmPath.class ) ); assertThat( relationalPredicate.getLeftHandExpression(), instanceOf( SqmPath.class ) );
final SqmPath indexPath = (SqmPath) relationalPredicate.getLeftHandExpression(); final SqmPath<?> indexPath = (SqmPath<?>) relationalPredicate.getLeftHandExpression();
assertThat( indexPath.getLhs(), notNullValue() ); assertThat( indexPath.getLhs(), notNullValue() );
assertThat( indexPath.getLhs().getExplicitAlias(), is( "l" ) ); assertThat( indexPath.getLhs().getExplicitAlias(), is( "l" ) );

View File

@ -48,12 +48,12 @@ protected boolean strictJpaCompliance() {
public void registerAfterLoadAction(AfterLoadAction afterLoadAction) { public void registerAfterLoadAction(AfterLoadAction afterLoadAction) {
} }
protected SqmSelectStatement interpretSelect(String hql) { protected SqmSelectStatement<?> interpretSelect(String hql) {
return interpretSelect( hql, sessionFactory() ); return interpretSelect( hql, sessionFactory() );
} }
public static SqmSelectStatement interpretSelect(String hql, SessionFactoryImplementor sessionFactory) { public static SqmSelectStatement<?> interpretSelect(String hql, SessionFactoryImplementor sessionFactory) {
return (SqmSelectStatement) sessionFactory.getQueryEngine().getHqlTranslator().translate( hql ); return (SqmSelectStatement<?>) sessionFactory.getQueryEngine().getHqlTranslator().translate( hql );
} }
@Override @Override

View File

@ -52,7 +52,7 @@ public class IdSelectionTests {
@Test @Test
public void testSecondaryTableRestrictedOnRootTable(SessionFactoryScope scope) { public void testSecondaryTableRestrictedOnRootTable(SessionFactoryScope scope) {
final SqmDeleteStatement sqm = (SqmDeleteStatement) scope.getSessionFactory() final SqmDeleteStatement<?> sqm = (SqmDeleteStatement<?>) scope.getSessionFactory()
.getQueryEngine() .getQueryEngine()
.getHqlTranslator() .getHqlTranslator()
.translate( "delete SimpleEntityWithSecondaryTables where name = :n" ); .translate( "delete SimpleEntityWithSecondaryTables where name = :n" );
@ -77,7 +77,7 @@ public void testSecondaryTableRestrictedOnRootTable(SessionFactoryScope scope) {
@Test @Test
public void testSecondaryTableRestrictedOnNonRootTable(SessionFactoryScope scope) { public void testSecondaryTableRestrictedOnNonRootTable(SessionFactoryScope scope) {
final SqmDeleteStatement sqm = (SqmDeleteStatement) scope.getSessionFactory() final SqmDeleteStatement<?> sqm = (SqmDeleteStatement<?>) scope.getSessionFactory()
.getQueryEngine() .getQueryEngine()
.getHqlTranslator() .getHqlTranslator()
.translate( "delete SimpleEntityWithSecondaryTables where data = :d" ); .translate( "delete SimpleEntityWithSecondaryTables where data = :d" );
@ -102,7 +102,7 @@ public void testSecondaryTableRestrictedOnNonRootTable(SessionFactoryScope scope
@Test @Test
public void testJoinedSubclassRestrictedOnRootTable(SessionFactoryScope scope) { public void testJoinedSubclassRestrictedOnRootTable(SessionFactoryScope scope) {
final SqmDeleteStatement sqm = (SqmDeleteStatement) scope.getSessionFactory() final SqmDeleteStatement<?> sqm = (SqmDeleteStatement<?>) scope.getSessionFactory()
.getQueryEngine() .getQueryEngine()
.getHqlTranslator() .getHqlTranslator()
.translate( "delete Customer where name = :n" ); .translate( "delete Customer where name = :n" );
@ -127,7 +127,7 @@ public void testJoinedSubclassRestrictedOnRootTable(SessionFactoryScope scope) {
@Test @Test
public void testJoinedSubclassRestrictedOnNonPrimaryRootTable(SessionFactoryScope scope) { public void testJoinedSubclassRestrictedOnNonPrimaryRootTable(SessionFactoryScope scope) {
final SqmDeleteStatement sqm = (SqmDeleteStatement) scope.getSessionFactory() final SqmDeleteStatement<?> sqm = (SqmDeleteStatement<?>) scope.getSessionFactory()
.getQueryEngine() .getQueryEngine()
.getHqlTranslator() .getHqlTranslator()
.translate( "delete ForeignCustomer where name = :n" ); .translate( "delete ForeignCustomer where name = :n" );
@ -152,7 +152,7 @@ public void testJoinedSubclassRestrictedOnNonPrimaryRootTable(SessionFactoryScop
@Test @Test
public void testJoinedSubclassRestrictedOnPrimaryNonRootTable(SessionFactoryScope scope) { public void testJoinedSubclassRestrictedOnPrimaryNonRootTable(SessionFactoryScope scope) {
final SqmDeleteStatement sqm = (SqmDeleteStatement) scope.getSessionFactory() final SqmDeleteStatement<?> sqm = (SqmDeleteStatement<?>) scope.getSessionFactory()
.getQueryEngine() .getQueryEngine()
.getHqlTranslator() .getHqlTranslator()
.translate( "delete ForeignCustomer where vat = :v" ); .translate( "delete ForeignCustomer where vat = :v" );

View File

@ -0,0 +1,163 @@
/*
* 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.orm.test.set;
import java.util.List;
import javax.persistence.Tuple;
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
import org.hibernate.query.criteria.JpaCriteriaQuery;
import org.hibernate.query.criteria.JpaRoot;
import org.hibernate.testing.orm.domain.StandardDomainModel;
import org.hibernate.testing.orm.domain.gambit.EntityOfLists;
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
/**
*
* @author Christian Beikov
*/
@DomainModel( standardModels = StandardDomainModel.GAMBIT )
@ServiceRegistry
@SessionFactory
public class SetOperationJpaCriteriaTest {
@BeforeEach
public void createTestData(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
session.save( new EntityOfLists( 1, "first" ) );
session.save( new EntityOfLists( 2, "second" ) );
session.save( new EntityOfLists( 3, "third" ) );
}
);
}
@AfterEach
public void dropTestData(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
session.createQuery( "delete from EntityOfLists" ).executeUpdate();
session.createQuery( "delete from SimpleEntity" ).executeUpdate();
}
);
}
@Test
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsUnion.class)
public void testUnionAll(SessionFactoryScope scope) {
scope.inSession(
session -> {
HibernateCriteriaBuilder cb = session.getCriteriaBuilder();
JpaCriteriaQuery<EntityOfLists> query1 = cb.createQuery( EntityOfLists.class );
JpaRoot<EntityOfLists> root1 = query1.from( EntityOfLists.class );
query1.where( cb.equal( root1.get( "id" ), 1 ) );
JpaCriteriaQuery<EntityOfLists> query2 = cb.createQuery( EntityOfLists.class );
JpaRoot<EntityOfLists> root2 = query2.from( EntityOfLists.class );
query2.where( cb.equal( root2.get( "id" ), 2 ) );
List<EntityOfLists> list = session.createQuery(
cb.unionAll( query1, query2 )
).list();
assertThat( list.size(), is( 2 ) );
}
);
}
@Test
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsUnion.class)
public void testUnionAllLimit(SessionFactoryScope scope) {
scope.inSession(
session -> {
HibernateCriteriaBuilder cb = session.getCriteriaBuilder();
JpaCriteriaQuery<EntityOfLists> query1 = cb.createQuery( EntityOfLists.class );
JpaRoot<EntityOfLists> root1 = query1.from( EntityOfLists.class );
query1.where( cb.equal( root1.get( "id" ), 1 ) );
JpaCriteriaQuery<EntityOfLists> query2 = cb.createQuery( EntityOfLists.class );
JpaRoot<EntityOfLists> root2 = query2.from( EntityOfLists.class );
query2.where( cb.equal( root2.get( "id" ), 2 ) );
List<EntityOfLists> list = session.createQuery(
cb.unionAll( query1, query2 )
.orderBy( cb.asc( cb.literal( 1 ) ) )
.fetch( 1 )
).list();
assertThat( list.size(), is( 1 ) );
}
);
}
@Test
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsUnion.class)
public void testUnionAllLimitSubquery(SessionFactoryScope scope) {
scope.inSession(
session -> {
HibernateCriteriaBuilder cb = session.getCriteriaBuilder();
JpaCriteriaQuery<EntityOfLists> query1 = cb.createQuery( EntityOfLists.class );
JpaRoot<EntityOfLists> root1 = query1.from( EntityOfLists.class );
query1.where( cb.equal( root1.get( "id" ), 1 ) );
JpaCriteriaQuery<EntityOfLists> query2 = cb.createQuery( EntityOfLists.class );
JpaRoot<EntityOfLists> root2 = query2.from( EntityOfLists.class );
query2.where( cb.equal( root2.get( "id" ), 2 ) );
List<EntityOfLists> list = session.createQuery(
cb.unionAll(
query1,
query2.orderBy( cb.asc( cb.literal( 1 ) ) )
.fetch( 1 )
)
).list();
assertThat( list.size(), is( 2 ) );
}
);
}
@Test
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsUnion.class)
public void testUnionAllLimitNested(SessionFactoryScope scope) {
scope.inSession(
session -> {
HibernateCriteriaBuilder cb = session.getCriteriaBuilder();
JpaCriteriaQuery<EntityOfLists> query1 = cb.createQuery( EntityOfLists.class );
JpaRoot<EntityOfLists> root1 = query1.from( EntityOfLists.class );
query1.where( cb.equal( root1.get( "id" ), 1 ) );
JpaCriteriaQuery<EntityOfLists> query2 = cb.createQuery( EntityOfLists.class );
JpaRoot<EntityOfLists> root2 = query2.from( EntityOfLists.class );
query2.where( cb.equal( root2.get( "id" ), 2 ) );
List<EntityOfLists> list = session.createQuery(
cb.unionAll(
query1,
query2.orderBy( cb.asc( cb.literal( 1 ) ) )
.fetch( 1 )
).orderBy( cb.asc( cb.literal( 1 ) ) )
.fetch( 1 )
).list();
assertThat( list.size(), is( 1 ) );
}
);
}
}

View File

@ -77,13 +77,12 @@ public void testSimpleHqlInterpretation(SessionFactoryScope scope) {
String.class String.class
); );
final HqlQueryImplementor<String> hqlQuery = (HqlQueryImplementor<String>) query; final HqlQueryImplementor<String> hqlQuery = (HqlQueryImplementor<String>) query;
//noinspection unchecked
final SqmSelectStatement<String> sqmStatement = (SqmSelectStatement<String>) hqlQuery.getSqmStatement(); final SqmSelectStatement<String> sqmStatement = (SqmSelectStatement<String>) hqlQuery.getSqmStatement();
final StandardSqmTranslator<SelectStatement> sqmConverter = new StandardSqmTranslator<>( final StandardSqmTranslator<SelectStatement> sqmConverter = new StandardSqmTranslator<>(
sqmStatement, sqmStatement,
hqlQuery.getQueryOptions(), hqlQuery.getQueryOptions(),
( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), ( (QuerySqmImpl<?>) hqlQuery ).getDomainParameterXref(),
query.getParameterBindings(), query.getParameterBindings(),
session.getLoadQueryInfluencers(), session.getLoadQueryInfluencers(),
scope.getSessionFactory() scope.getSessionFactory()
@ -138,13 +137,12 @@ public void testConvertedHqlInterpretation(SessionFactoryScope scope) {
session -> { session -> {
final QueryImplementor<Gender> query = session.createQuery( "select e.gender from SimpleEntity e", Gender.class ); final QueryImplementor<Gender> query = session.createQuery( "select e.gender from SimpleEntity e", Gender.class );
final HqlQueryImplementor<Gender> hqlQuery = (HqlQueryImplementor<Gender>) query; final HqlQueryImplementor<Gender> hqlQuery = (HqlQueryImplementor<Gender>) query;
//noinspection unchecked
final SqmSelectStatement<Gender> sqmStatement = (SqmSelectStatement<Gender>) hqlQuery.getSqmStatement(); final SqmSelectStatement<Gender> sqmStatement = (SqmSelectStatement<Gender>) hqlQuery.getSqmStatement();
final StandardSqmTranslator<SelectStatement> sqmConverter = new StandardSqmTranslator<>( final StandardSqmTranslator<SelectStatement> sqmConverter = new StandardSqmTranslator<>(
sqmStatement, sqmStatement,
hqlQuery.getQueryOptions(), hqlQuery.getQueryOptions(),
( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), ( (QuerySqmImpl<?>) hqlQuery ).getDomainParameterXref(),
query.getParameterBindings(), query.getParameterBindings(),
session.getLoadQueryInfluencers(), session.getLoadQueryInfluencers(),
scope.getSessionFactory() scope.getSessionFactory()

View File

@ -28,7 +28,7 @@ protected SelectStatement interpret(String hql, SessionFactoryImplementor sessio
protected SelectStatement interpret(String hql, QueryParameterBindings parameterBindings, SessionFactoryImplementor sessionFactory) { protected SelectStatement interpret(String hql, QueryParameterBindings parameterBindings, SessionFactoryImplementor sessionFactory) {
final QueryEngine queryEngine = sessionFactory.getQueryEngine(); final QueryEngine queryEngine = sessionFactory.getQueryEngine();
final SqmSelectStatement sqm = (SqmSelectStatement) queryEngine.getHqlTranslator().translate( hql ); final SqmSelectStatement<?> sqm = (SqmSelectStatement<?>) queryEngine.getHqlTranslator().translate( hql );
final SqmTranslatorFactory sqmTranslatorFactory = queryEngine.getSqmTranslatorFactory(); final SqmTranslatorFactory sqmTranslatorFactory = queryEngine.getSqmTranslatorFactory();
final SqmTranslator<SelectStatement> sqmConverter = sqmTranslatorFactory.createSelectTranslator( final SqmTranslator<SelectStatement> sqmConverter = sqmTranslatorFactory.createSelectTranslator(

View File

@ -269,19 +269,19 @@ public void testJpaTypeOperator() {
// select clause // select clause
// control // control
Query query = session.createQuery( "select a.class from Animal a where a.class = Dog" ); Query<?> query = session.createQuery( "select a.class from Animal a where a.class = Dog" );
query.list(); query.list();
SqmSelectStatement sqmStatement = (SqmSelectStatement) query.unwrap( QuerySqmImpl.class ).getSqmStatement(); SqmSelectStatement<?> sqmStatement = (SqmSelectStatement<?>) query.unwrap( QuerySqmImpl.class ).getSqmStatement();
List<SqmSelection> selections = sqmStatement.getQuerySpec().getSelectClause().getSelections(); List<SqmSelection> selections = sqmStatement.getQuerySpec().getSelectClause().getSelections();
assertEquals( 1, selections.size() ); assertEquals( 1, selections.size() );
SqmSelection typeSelection = selections.get( 0 ); SqmSelection<?> typeSelection = selections.get( 0 );
// always integer for joined // always integer for joined
assertEquals( Integer.class, typeSelection.getNodeJavaTypeDescriptor().getJavaType() ); assertEquals( Integer.class, typeSelection.getNodeJavaTypeDescriptor().getJavaType() );
// test // test
query = session.createQuery( "select type(a) from Animal a where type(a) = Dog" ); query = session.createQuery( "select type(a) from Animal a where type(a) = Dog" );
query.list(); query.list();
sqmStatement = (SqmSelectStatement) query.unwrap( QuerySqmImpl.class ).getSqmStatement(); sqmStatement = (SqmSelectStatement<?>) query.unwrap( QuerySqmImpl.class ).getSqmStatement();
selections = sqmStatement.getQuerySpec().getSelectClause().getSelections(); selections = sqmStatement.getQuerySpec().getSelectClause().getSelections();
assertEquals( 1, selections.size() ); assertEquals( 1, selections.size() );
typeSelection = selections.get( 0 ); typeSelection = selections.get( 0 );
@ -1540,11 +1540,11 @@ public void testJPAPositionalParameterList() {
public void testComponentQueries() { public void testComponentQueries() {
inTransaction( inTransaction(
session -> { session -> {
final QueryImplementor query = session.createQuery( "select h.name from Human h" ); final QueryImplementor<?> query = session.createQuery( "select h.name from Human h" );
final SqmSelectStatement sqmStatement = (SqmSelectStatement) query.unwrap( QuerySqmImpl.class ).getSqmStatement(); final SqmSelectStatement<?> sqmStatement = (SqmSelectStatement<?>) query.unwrap( QuerySqmImpl.class ).getSqmStatement();
assertEquals( 1, sqmStatement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, sqmStatement.getQuerySpec().getSelectClause().getSelections().size() );
final SqmSelection selection = sqmStatement.getQuerySpec().getSelectClause().getSelections().get( 0 ); final SqmSelection<?> selection = sqmStatement.getQuerySpec().getSelectClause().getSelections().get( 0 );
final SqmExpressable selectionType = selection.getSelectableNode().getNodeType(); final SqmExpressable<?> selectionType = selection.getSelectableNode().getNodeType();
assertThat( selectionType, CoreMatchers.instanceOf( EmbeddableDomainType.class ) ); assertThat( selectionType, CoreMatchers.instanceOf( EmbeddableDomainType.class ) );
assertEquals( Name.class, selection.getNodeJavaTypeDescriptor().getJavaType() ); assertEquals( Name.class, selection.getNodeJavaTypeDescriptor().getJavaType() );
@ -1824,10 +1824,10 @@ public void testQueryMetadataRetrievalWithFetching() {
inSession( inSession(
session -> { session -> {
final Query query = session.createQuery( "from Animal a inner join fetch a.mother" ); final Query query = session.createQuery( "from Animal a inner join fetch a.mother" );
final SqmSelectStatement sqmStatement = (SqmSelectStatement) query.unwrap( QuerySqmImpl.class ).getSqmStatement(); final SqmSelectStatement<?> sqmStatement = (SqmSelectStatement<?>) query.unwrap( QuerySqmImpl.class ).getSqmStatement();
assertEquals( 1, sqmStatement.getQuerySpec().getSelectClause().getSelections().size() ); assertEquals( 1, sqmStatement.getQuerySpec().getSelectClause().getSelections().size() );
final SqmSelection selection = sqmStatement.getQuerySpec().getSelectClause().getSelections().get( 0 ); final SqmSelection<?> selection = sqmStatement.getQuerySpec().getSelectClause().getSelections().get( 0 );
final SqmExpressable selectionType = selection.getSelectableNode().getNodeType(); final SqmExpressable<?> selectionType = selection.getSelectableNode().getNodeType();
assertThat( selectionType, instanceOf( EntityDomainType.class ) ); assertThat( selectionType, instanceOf( EntityDomainType.class ) );
assertThat( selectionType.getExpressableJavaTypeDescriptor().getJavaType(), equalTo( Animal.class ) ); assertThat( selectionType.getExpressableJavaTypeDescriptor().getJavaType(), equalTo( Animal.class ) );
assertThat( selection.getAlias(), is( "a" ) ); assertThat( selection.getAlias(), is( "a" ) );
@ -2148,15 +2148,15 @@ public void testSelectClauseImplicitJoin() {
} }
private static void verifyAnimalZooSelection(Query q) { private static void verifyAnimalZooSelection(Query q) {
final SqmSelectStatement sqmStatement = (SqmSelectStatement) q.unwrap( QuerySqmImpl.class ).getSqmStatement(); final SqmSelectStatement<?> sqmStatement = (SqmSelectStatement<?>) q.unwrap( QuerySqmImpl.class ).getSqmStatement();
final SqmSelection sqmSelection = sqmStatement.getQuerySpec().getSelectClause().getSelections().get( 0 ); final SqmSelection<?> sqmSelection = sqmStatement.getQuerySpec().getSelectClause().getSelections().get( 0 );
assertThat( sqmSelection.getSelectableNode(), instanceOf( SqmPath.class ) ); assertThat( sqmSelection.getSelectableNode(), instanceOf( SqmPath.class ) );
final SqmPath selectedPath = (SqmPath) sqmSelection.getSelectableNode(); final SqmPath<?> selectedPath = (SqmPath<?>) sqmSelection.getSelectableNode();
assertThat( selectedPath.getReferencedPathSource(), instanceOf( SingularPersistentAttribute.class ) ); assertThat( selectedPath.getReferencedPathSource(), instanceOf( SingularPersistentAttribute.class ) );
final SingularPersistentAttribute selectedAttr = (SingularPersistentAttribute) selectedPath.getReferencedPathSource(); final SingularPersistentAttribute selectedAttr = (SingularPersistentAttribute) selectedPath.getReferencedPathSource();
assertThat( selectedAttr.getName(), is( "zoo" ) ); assertThat( selectedAttr.getName(), is( "zoo" ) );
assertThat( selectedAttr.getType(), instanceOf( EntityDomainType.class ) ); assertThat( selectedAttr.getType(), instanceOf( EntityDomainType.class ) );
final EntityDomainType zooType = (EntityDomainType) selectedAttr.getType(); final EntityDomainType<?> zooType = (EntityDomainType<?>) selectedAttr.getType();
assertThat( zooType.getHibernateEntityName(), is( Zoo.class.getName() ) ); assertThat( zooType.getHibernateEntityName(), is( Zoo.class.getName() ) );
} }
@ -2596,15 +2596,15 @@ public void testAliases() {
a.setDescription("an animal"); a.setDescription("an animal");
s.persist(a); s.persist(a);
Query q = s.createQuery( "select a.bodyWeight as abw, a.description from Animal a" ); Query<?> q = s.createQuery( "select a.bodyWeight as abw, a.description from Animal a" );
SqmSelectStatement sqmStatement = (SqmSelectStatement) q.unwrap( QuerySqmImpl.class ).getSqmStatement(); SqmSelectStatement<?> sqmStatement = (SqmSelectStatement<?>) q.unwrap( QuerySqmImpl.class ).getSqmStatement();
List<SqmSelection> selections = sqmStatement.getQuerySpec().getSelectClause().getSelections(); List<SqmSelection> selections = sqmStatement.getQuerySpec().getSelectClause().getSelections();
assertThat( selections.size(), is( 2 ) ); assertThat( selections.size(), is( 2 ) );
assertThat( selections.get( 0 ).getAlias(), is( "abw" ) ); assertThat( selections.get( 0 ).getAlias(), is( "abw" ) );
assertThat( selections.get( 1 ).getAlias(), nullValue() ); assertThat( selections.get( 1 ).getAlias(), nullValue() );
q = s.createQuery("select count(*), avg(a.bodyWeight) as avg from Animal a"); q = s.createQuery("select count(*), avg(a.bodyWeight) as avg from Animal a");
sqmStatement = (SqmSelectStatement) q.unwrap( QuerySqmImpl.class ).getSqmStatement(); sqmStatement = (SqmSelectStatement<?>) q.unwrap( QuerySqmImpl.class ).getSqmStatement();
selections = sqmStatement.getQuerySpec().getSelectClause().getSelections(); selections = sqmStatement.getQuerySpec().getSelectClause().getSelections();
assertThat( selections.size(), is( 2 ) ); assertThat( selections.size(), is( 2 ) );
assertThat( selections.get( 0 ), nullValue() ); assertThat( selections.get( 0 ), nullValue() );