mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-12 22:24:47 +00:00
HHH-14452 Support set operations in JPA Criteria API
This commit is contained in:
parent
222837df95
commit
6b66feb0ac
@ -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
|
||||||
);
|
);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
)
|
)
|
||||||
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -21,5 +21,5 @@ public interface HqlQueryImplementor<R> extends QueryImplementor<R>, NameableQue
|
|||||||
@Override
|
@Override
|
||||||
ParameterMetadataImplementor getParameterMetadata();
|
ParameterMetadataImplementor getParameterMetadata();
|
||||||
|
|
||||||
SqmStatement getSqmStatement();
|
SqmStatement<R> getSqmStatement();
|
||||||
}
|
}
|
||||||
|
@ -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 ) {
|
||||||
|
@ -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 );
|
||||||
|
@ -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> {
|
||||||
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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 ),
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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 ) {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 ) );
|
||||||
|
@ -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() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -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() );
|
||||||
|
@ -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() );
|
||||||
|
@ -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'" );
|
||||||
|
@ -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) );
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
);
|
);
|
||||||
|
@ -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" ) );
|
||||||
|
@ -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
|
||||||
|
@ -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" );
|
||||||
|
@ -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 ) );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -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()
|
||||||
|
@ -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(
|
||||||
|
@ -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() );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user