Skip to content

Commit 3dc5896

Browse files
committed
handle inner enum literal in HQL
Signed-off-by: Gavin King <[email protected]>
1 parent ce31796 commit 3dc5896

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

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

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.hibernate.type.descriptor.java.JavaType;
5555
import org.hibernate.type.descriptor.java.spi.DynamicModelJavaType;
5656
import org.hibernate.type.descriptor.java.spi.EntityJavaType;
57+
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
5758
import org.hibernate.type.spi.TypeConfiguration;
5859

5960
import jakarta.persistence.EntityGraph;
@@ -245,17 +246,29 @@ public Set<String> getAllowedEnumLiteralTexts(String enumValue) {
245246

246247
@Override
247248
public EnumJavaType<?> getEnumType(String prefix) {
249+
final ClassLoaderService classLoaderService =
250+
getServiceRegistry().requireService(ClassLoaderService.class);
251+
final JavaTypeRegistry registry = getTypeConfiguration().getJavaTypeRegistry();
248252
try {
249-
final Class<?> namedClass =
250-
getServiceRegistry().requireService( ClassLoaderService.class )
251-
.classForName( prefix );
253+
final Class<?> namedClass = classLoaderService.classForName( prefix );
252254
if ( namedClass != null && namedClass.isEnum() ) {
253-
return (EnumJavaType) getTypeConfiguration()
254-
.getJavaTypeRegistry()
255-
.resolveDescriptor(namedClass);
255+
return (EnumJavaType) registry.resolveDescriptor(namedClass);
256256
}
257257
}
258-
catch (Exception ignore) {
258+
catch (ClassLoadingException classLoadingException) {
259+
try {
260+
final int lastDot = prefix.lastIndexOf('.');
261+
if ( lastDot>0) {
262+
final String replaced =
263+
prefix.substring(0, lastDot) + '$' + prefix.substring(lastDot+1);
264+
final Class<?> namedClass = classLoaderService.classForName( replaced );
265+
if ( namedClass != null && namedClass.isEnum() ) {
266+
return (EnumJavaType) registry.resolveDescriptor(namedClass);
267+
}
268+
}
269+
}
270+
catch (ClassLoadingException ignore) {
271+
}
259272
}
260273
return null;
261274
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2624,7 +2624,15 @@ private String getPossibleEnumValue(HqlParser.ExpressionContext expressionContex
26242624
ctx = ctx.getChild( 0 );
26252625

26262626
if ( ctx instanceof HqlParser.SimplePathContext ) {
2627-
return ctx.getText();
2627+
HqlParser.SimplePathContext simplePathContext = (HqlParser.SimplePathContext) ctx;
2628+
int size = simplePathContext.simplePathElement().size();
2629+
if ( size==0 ) {
2630+
return simplePathContext.getText();
2631+
}
2632+
else {
2633+
return simplePathContext.simplePathElement(size -1)
2634+
.identifier().getText();
2635+
}
26282636
}
26292637
}
26302638
}

0 commit comments

Comments
 (0)