Skip to content

Commit 1c87d73

Browse files
committed
HHH-18569 Don´t implicitly cast when using a subtype attribute name with Criteria API
1 parent c1cbbf1 commit 1c87d73

36 files changed

+130
-89
lines changed

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import org.hibernate.metamodel.mapping.CollectionPart;
1313
import org.hibernate.metamodel.model.domain.DomainType;
1414
import org.hibernate.metamodel.model.domain.EntityDomainType;
15-
import org.hibernate.metamodel.model.domain.JpaMetamodel;
1615
import org.hibernate.metamodel.model.domain.PluralPersistentAttribute;
1716
import org.hibernate.metamodel.model.domain.SimpleDomainType;
1817
import org.hibernate.spi.NavigablePath;
@@ -87,11 +86,11 @@ public SqmPathSource<?> findSubPathSource(String name) {
8786
}
8887

8988
@Override
90-
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
89+
public SqmPathSource<?> findSubPathSource(String name, boolean includeSubtypes) {
9190
if ( CollectionPart.Nature.ELEMENT.getName().equals( name ) ) {
9291
return elementPathSource;
9392
}
94-
return elementPathSource.findSubPathSource( name, metamodel );
93+
return elementPathSource.findSubPathSource( name, includeSubtypes );
9594
}
9695

9796
@Override

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package org.hibernate.metamodel.model.domain.internal;
66

77
import org.hibernate.metamodel.model.domain.EntityDomainType;
8-
import org.hibernate.metamodel.model.domain.JpaMetamodel;
98
import org.hibernate.query.hql.spi.SqmCreationState;
109
import org.hibernate.query.sqm.SqmJoinable;
1110
import org.hibernate.query.sqm.SqmPathSource;
@@ -42,8 +41,8 @@ public SqmPathSource<?> findSubPathSource(String name) {
4241
}
4342

4443
@Override
45-
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
46-
return getSqmPathType().findSubPathSource( name, metamodel );
44+
public SqmPathSource<?> findSubPathSource(String name, boolean includeSubtypes) {
45+
return getSqmPathType().findSubPathSource( name, includeSubtypes );
4746
}
4847

4948
@Override

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,13 @@ public EntityDomainType<J> getSqmPathType() {
139139

140140
@Override
141141
public SqmPathSource<?> findSubPathSource(String name) {
142-
final PersistentAttribute<? super J,?> attribute = findAttribute( name );
142+
final PersistentAttribute<? super J,?> attribute = super.findAttribute( name );
143143
if ( attribute != null ) {
144144
return (SqmPathSource<?>) attribute;
145145
}
146146
else if ( EntityIdentifierMapping.matchesRoleName( name ) ) {
147147
return hasSingleIdAttribute() ? findIdAttribute() : getIdentifierDescriptor();
148148
}
149-
150149
else if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) {
151150
return discriminatorPathSource;
152151
}
@@ -156,18 +155,19 @@ else if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) {
156155
}
157156

158157
@Override
159-
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
158+
public SqmPathSource<?> findSubPathSource(String name, boolean includeSubtypes) {
160159
final PersistentAttribute<? super J,?> attribute = super.findAttribute( name );
161160
if ( attribute != null ) {
162161
return (SqmPathSource<?>) attribute;
163162
}
164163
else {
165-
//TODO: eliminate this cast!
166-
final PersistentAttribute<?, ?> subtypeAttribute = findSubtypeAttribute( name );
167-
if ( subtypeAttribute != null ) {
168-
return (SqmPathSource<?>) subtypeAttribute;
164+
if ( includeSubtypes ) {
165+
final PersistentAttribute<?, ?> subtypeAttribute = findSubtypeAttribute( name );
166+
if ( subtypeAttribute != null ) {
167+
return (SqmPathSource<?>) subtypeAttribute;
168+
}
169169
}
170-
else if ( EntityIdentifierMapping.matchesRoleName( name ) ) {
170+
if ( EntityIdentifierMapping.matchesRoleName( name ) ) {
171171
return hasSingleIdAttribute() ? findIdAttribute() : getIdentifierDescriptor();
172172
}
173173
else if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) {

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import org.hibernate.metamodel.internal.MetadataContext;
1010
import org.hibernate.metamodel.mapping.CollectionPart;
11-
import org.hibernate.metamodel.model.domain.JpaMetamodel;
1211
import org.hibernate.metamodel.model.domain.ListPersistentAttribute;
1312
import org.hibernate.query.sqm.SqmPathSource;
1413
import org.hibernate.query.hql.spi.SqmCreationState;
@@ -60,7 +59,7 @@ public SqmPathSource<?> findSubPathSource(String name) {
6059
}
6160

6261
@Override
63-
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
62+
public SqmPathSource<?> findSubPathSource(String name, boolean includeSubtypes) {
6463
final CollectionPart.Nature nature = CollectionPart.Nature.fromNameExact( name );
6564
if ( nature != null ) {
6665
switch ( nature ) {
@@ -70,7 +69,7 @@ public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
7069
return getElementPathSource();
7170
}
7271
}
73-
return getElementPathSource().findSubPathSource( name, metamodel );
72+
return getElementPathSource().findSubPathSource( name, includeSubtypes );
7473
}
7574

7675
@Override

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import org.hibernate.metamodel.internal.MetadataContext;
1010
import org.hibernate.metamodel.mapping.CollectionPart;
11-
import org.hibernate.metamodel.model.domain.JpaMetamodel;
1211
import org.hibernate.metamodel.model.domain.MapPersistentAttribute;
1312
import org.hibernate.metamodel.model.domain.SimpleDomainType;
1413
import org.hibernate.query.sqm.SqmPathSource;
@@ -70,7 +69,7 @@ public SqmPathSource<?> findSubPathSource(String name) {
7069
}
7170

7271
@Override
73-
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
72+
public SqmPathSource<?> findSubPathSource(String name, boolean includeSubtypes) {
7473
final CollectionPart.Nature nature = CollectionPart.Nature.fromNameExact( name );
7574
if ( nature != null ) {
7675
switch ( nature ) {
@@ -80,7 +79,7 @@ public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
8079
return getElementPathSource();
8180
}
8281
}
83-
return getElementPathSource().findSubPathSource( name, metamodel );
82+
return getElementPathSource().findSubPathSource( name, includeSubtypes );
8483
}
8584

8685
@Override

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import org.hibernate.metamodel.model.domain.DomainType;
1515
import org.hibernate.metamodel.model.domain.EntityDomainType;
1616
import org.hibernate.metamodel.model.domain.IdentifiableDomainType;
17-
import org.hibernate.metamodel.model.domain.JpaMetamodel;
1817
import org.hibernate.metamodel.model.domain.ManagedDomainType;
1918
import org.hibernate.metamodel.model.domain.PluralPersistentAttribute;
2019
import org.hibernate.metamodel.model.domain.SimpleDomainType;
@@ -132,8 +131,8 @@ public SqmPathSource<?> findSubPathSource(String name) {
132131
}
133132

134133
@Override
135-
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
136-
return sqmPathSource.findSubPathSource( name, metamodel );
134+
public SqmPathSource<?> findSubPathSource(String name, boolean includeSubtypes) {
135+
return sqmPathSource.findSubPathSource( name, includeSubtypes );
137136
}
138137

139138
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public SemanticPathPart resolvePathPart(
145145
if ( pathRootByExposedNavigable != null ) {
146146
// identifier is an "unqualified attribute reference"
147147
validateAsRoot( pathRootByExposedNavigable );
148-
final SqmPath<?> sqmPath = pathRootByExposedNavigable.get( identifier );
148+
final SqmPath<?> sqmPath = pathRootByExposedNavigable.get( identifier, true );
149149
return isTerminal ? sqmPath : new DomainPathPart( sqmPath );
150150
}
151151
}

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,7 @@ private AttributeJoinDelegate resolveAlias(String identifier, boolean isTerminal
188188
boolean isTerminal,
189189
boolean allowReuse,
190190
SqmCreationState creationState) {
191-
final SqmPathSource<?> subPathSource = lhs.getResolvedModel().getSubPathSource(
192-
name,
193-
creationState.getCreationContext().getJpaMetamodel()
194-
);
191+
final SqmPathSource<?> subPathSource = lhs.getResolvedModel().getSubPathSource( name, true );
195192
if ( allowReuse ) {
196193
if ( !isTerminal ) {
197194
for ( SqmJoin<?, ?> sqmJoin : lhs.getSqmJoins() ) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3587,7 +3587,7 @@ public SqmPath<?> visitEntityIdReference(HqlParser.EntityIdReferenceContext ctx)
35873587
+ "' of 'id()' is a '" + identifiableType.getTypeName()
35883588
+ "' and does not have a well-defined '@Id' attribute" );
35893589
}
3590-
return sqmPath.get( identifierDescriptor.getPathName() );
3590+
return sqmPath.get( identifierDescriptor.getPathName(), true );
35913591
}
35923592
else if ( sqmPath instanceof SqmAnyValuedSimplePath<?> ) {
35933593
return sqmPath.resolvePathPart( AnyKeyPart.KEY_NAME, true, processingStateStack.getCurrent().getCreationState() );

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ else if ( parentRegistered instanceof SqmEntityJoin<?,?> ) {
335335

336336
private boolean definesAttribute(SqmPathSource<?> containerType, String name) {
337337
return !( containerType.getSqmType() instanceof BasicDomainType )
338-
&& containerType.findSubPathSource( name, getJpaMetamodel() ) != null;
338+
&& containerType.findSubPathSource( name, true ) != null;
339339
}
340340

341341
private JpaMetamodel getJpaMetamodel() {

0 commit comments

Comments
 (0)