Skip to content

Commit 476ed03

Browse files
lvydrabeikov
authored andcommitted
[HHH-16739][JBEAP-30930] Several failures when comparing enum parameters with constant values
1 parent 71df3f4 commit 476ed03

36 files changed

+458
-77
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/function/InverseDistributionFunction.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,11 @@ public SelfRenderingInverseDistributionFunction(
153153

154154
@Override
155155
protected ReturnableType<?> resolveResultType(TypeConfiguration typeConfiguration) {
156-
return (ReturnableType<?>) withinGroupClause.getSortSpecifications().get( 0 ).getSortExpression()
157-
.getExpressible();
156+
return (ReturnableType<?>)
157+
getWithinGroup().getSortSpecifications().get( 0 )
158+
.getSortExpression()
159+
.getExpressible()
160+
.getSqmType();
158161
}
159162

160163
@Override

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/DomainType.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@
2626
* @author Steve Ebersole
2727
*/
2828
public interface DomainType<J> extends SqmExpressible<J> {
29+
30+
@Override
31+
default DomainType<J> getSqmType() {
32+
return this;
33+
}
34+
2935
/**
3036
* The name of the type.
3137
*

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/EntityDomainType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,9 @@ public interface EntityDomainType<J> extends IdentifiableDomainType<J>, EntityTy
2222

2323
@Override
2424
Collection<? extends EntityDomainType<? extends J>> getSubTypes();
25+
26+
@Override
27+
default DomainType<J> getSqmType() {
28+
return this;
29+
}
2530
}

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/MappedSuperclassDomainType.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,8 @@
1616
* @author Steve Ebersole
1717
*/
1818
public interface MappedSuperclassDomainType<J> extends IdentifiableDomainType<J>, MappedSuperclassType<J>, SqmPathSource<J> {
19+
@Override
20+
default DomainType<J> getSqmType() {
21+
return IdentifiableDomainType.super.getSqmType();
22+
}
1923
}

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AnyDiscriminatorSqmPathSource.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package org.hibernate.metamodel.model.domain.internal;
88

9+
import org.hibernate.metamodel.model.domain.DomainType;
910
import org.hibernate.metamodel.model.domain.SimpleDomainType;
1011
import org.hibernate.query.ReturnableType;
1112
import org.hibernate.query.sqm.SqmPathSource;
@@ -61,6 +62,11 @@ public BasicType<D> getSqmPathType() {
6162
return (BasicType<D>) super.getSqmPathType();
6263
}
6364

65+
@Override
66+
public DomainType<D> getSqmType() {
67+
return getSqmPathType();
68+
}
69+
6470
@Override
6571
public JavaType<D> getExpressibleJavaType() {
6672
return getSqmPathType().getExpressibleJavaType();

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/BasicSqmPathSource.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package org.hibernate.metamodel.model.domain.internal;
88

99
import org.hibernate.metamodel.model.domain.BasicDomainType;
10+
import org.hibernate.metamodel.model.domain.DomainType;
1011
import org.hibernate.query.ReturnableType;
1112
import org.hibernate.query.sqm.SqmPathSource;
1213
import org.hibernate.query.sqm.tree.domain.SqmBasicValuedSimplePath;
@@ -41,6 +42,11 @@ public BasicDomainType<J> getSqmPathType() {
4142
return (BasicDomainType<J>) super.getSqmPathType();
4243
}
4344

45+
@Override
46+
public DomainType<J> getSqmType() {
47+
return getSqmPathType();
48+
}
49+
4450
@Override
4551
public SqmPathSource<?> findSubPathSource(String name) {
4652
throw new IllegalStateException( "Basic paths cannot be dereferenced" );

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/DiscriminatorSqmPathSource.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,9 @@ public PersistenceType getPersistenceType() {
6060
public Class<D> getJavaType() {
6161
return getExpressibleJavaType().getJavaTypeClass();
6262
}
63+
64+
@Override
65+
public DomainType<D> getSqmType() {
66+
return this;
67+
}
6368
}

hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -756,8 +756,7 @@ private String[] doGetImplementors(Class<?> clazz) throws MappingException {
756756
@Override
757757
public MappingModelExpressible<?> resolveMappingExpressible(
758758
SqmExpressible<?> sqmExpressible,
759-
Function<NavigablePath,
760-
TableGroup> tableGroupLocator) {
759+
Function<NavigablePath, TableGroup> tableGroupLocator) {
761760
if ( sqmExpressible instanceof SqmPath ) {
762761
final SqmPath<?> sqmPath = (SqmPath<?>) sqmExpressible;
763762
final NavigablePath navigablePath = sqmPath.getNavigablePath();

hibernate-core/src/main/java/org/hibernate/query/derived/AnonymousTupleType.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ else if ( sqmPath.getNodeType() instanceof EntityDomainType<?> ) {
212212
else {
213213
return new AnonymousTupleSimpleSqmPathSource<>(
214214
name,
215-
(DomainType<? extends Object>) component.getExpressible(),
215+
component.getExpressible().getSqmType(),
216216
BindableType.SINGULAR_ATTRIBUTE
217217
);
218218
}
@@ -244,6 +244,11 @@ public DomainType<?> getSqmPathType() {
244244
return this;
245245
}
246246

247+
@Override
248+
public DomainType<T> getSqmType() {
249+
return this;
250+
}
251+
247252
@Override
248253
public SqmPath<T> createSqmPath(SqmPath<?> lhs, SqmPathSource<?> intermediatePathSource) {
249254
throw new UnsupportedMappingException(

hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Calendar;
2727
import java.util.Collections;
2828
import java.util.GregorianCalendar;
29+
import java.util.HashMap;
2930
import java.util.HashSet;
3031
import java.util.List;
3132
import java.util.Locale;
@@ -121,6 +122,7 @@
121122
import org.hibernate.query.sqm.tree.domain.SqmPath;
122123
import org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath;
123124
import org.hibernate.query.sqm.tree.domain.SqmPolymorphicRootDescriptor;
125+
import org.hibernate.query.sqm.tree.expression.AbstractSqmParameter;
124126
import org.hibernate.query.sqm.tree.expression.SqmAliasedNodeRef;
125127
import org.hibernate.query.sqm.tree.expression.SqmAny;
126128
import org.hibernate.query.sqm.tree.expression.SqmAnyDiscriminatorValue;
@@ -310,6 +312,7 @@ public static <R> SqmStatement<R> buildSemanticModel(
310312

311313
private ParameterCollector parameterCollector;
312314
private ParameterStyle parameterStyle;
315+
private Map<Object, AbstractSqmParameter<?>> parameters;
313316

314317
private boolean isExtractingJdbcTemporalType;
315318
// Provides access to the current CTE that is being processed, which is potentially recursive
@@ -3832,14 +3835,14 @@ private <T> SqmNamedParameter<T> visitNamedParameter(
38323835
HqlParser.NamedParameterContext ctx,
38333836
SqmExpressible<T> expressibleType) {
38343837
parameterStyle = parameterStyle.withNamed();
3835-
final SqmNamedParameter<T> param = new SqmNamedParameter<>(
3836-
ctx.getChild( 1 ).getText(),
3837-
parameterDeclarationContextStack.getCurrent().isMultiValuedBindingAllowed(),
3838-
expressibleType,
3839-
creationContext.getNodeBuilder()
3838+
return resolveParameter(
3839+
new SqmNamedParameter<>(
3840+
ctx.getChild( 1 ).getText(),
3841+
parameterDeclarationContextStack.getCurrent().isMultiValuedBindingAllowed(),
3842+
expressibleType,
3843+
creationContext.getNodeBuilder()
3844+
)
38403845
);
3841-
parameterCollector.addParameter( param );
3842-
return param;
38433846
}
38443847

38453848
@Override
@@ -3854,14 +3857,28 @@ private <T> SqmPositionalParameter<T> visitPositionalParameter(
38543857
throw new SemanticException( "Unlabeled ordinal parameter ('?' rather than ?1)" );
38553858
}
38563859
parameterStyle = parameterStyle.withPositional();
3857-
final SqmPositionalParameter<T> param = new SqmPositionalParameter<>(
3858-
Integer.parseInt( ctx.getChild( 1 ).getText() ),
3859-
parameterDeclarationContextStack.getCurrent().isMultiValuedBindingAllowed(),
3860-
expressibleType,
3861-
creationContext.getNodeBuilder()
3860+
return resolveParameter(
3861+
new SqmPositionalParameter<>(
3862+
Integer.parseInt( ctx.getChild( 1 ).getText() ),
3863+
parameterDeclarationContextStack.getCurrent().isMultiValuedBindingAllowed(),
3864+
expressibleType,
3865+
creationContext.getNodeBuilder()
3866+
)
38623867
);
3863-
parameterCollector.addParameter( param );
3864-
return param;
3868+
}
3869+
3870+
private <T extends AbstractSqmParameter<?>> T resolveParameter(T parameter) {
3871+
if ( parameters == null ) {
3872+
parameters = new HashMap<>();
3873+
}
3874+
final Object key = parameter.getName() == null ? parameter.getPosition() : parameter.getName();
3875+
final AbstractSqmParameter<?> existingParameter = parameters.putIfAbsent( key, parameter );
3876+
if ( existingParameter == null ) {
3877+
parameterCollector.addParameter( parameter );
3878+
return parameter;
3879+
}
3880+
//noinspection unchecked
3881+
return (T) existingParameter;
38653882
}
38663883

38673884

0 commit comments

Comments
 (0)