@@ -586,18 +586,19 @@ public SqmInsertStatement<R> visitInsertStatement(HqlParser.InsertStatementConte
586586 final Iterator <SqmPath <?>> iterator = insertStatement .getInsertionTargetPaths ().iterator ();
587587 for ( int j = 1 ; j < values .getChildCount (); j += 2 ) {
588588 final SqmPath <?> targetPath = iterator .next ();
589- final Class <?> targetPathJavaType = targetPath .getJavaType ();
590- final boolean isEnum = targetPathJavaType != null && targetPathJavaType .isEnum ();
589+ final String targetPathJavaType = targetPath .getJavaTypeName ();
590+ final boolean isEnum = targetPath .isEnum ();
591591 final ParseTree valuesContext = values .getChild ( j );
592592 final HqlParser .ExpressionContext expressionContext ;
593- final Map < Class <?>, Enum <?>> possibleEnumValues ;
593+ final Set < String > possibleEnumTypes ;
594594 final SqmExpression <?> value ;
595595 if ( isEnum && valuesContext .getChild ( 0 ) instanceof HqlParser .ExpressionContext
596- && ( possibleEnumValues = getPossibleEnumValues ( expressionContext = (HqlParser .ExpressionContext ) valuesContext .getChild ( 0 ) ) ) != null ) {
596+ && ( possibleEnumTypes = getPossibleEnumTypes ( expressionContext = (HqlParser .ExpressionContext ) valuesContext .getChild ( 0 ) ) ) != null ) {
597597 value = resolveEnumShorthandLiteral (
598598 expressionContext ,
599- possibleEnumValues ,
600- targetPathJavaType
599+ getPossibleEnumValue ( expressionContext ),
600+ targetPathJavaType ,
601+ possibleEnumTypes
601602 );
602603 }
603604 else {
@@ -692,18 +693,19 @@ public SqmUpdateStatement<R> visitUpdateStatement(HqlParser.UpdateStatementConte
692693 public SqmAssignment <?> visitAssignment (HqlParser .AssignmentContext ctx ) {
693694 //noinspection unchecked
694695 final SqmPath <Object > targetPath = (SqmPath <Object >) consumeDomainPath ( ctx .simplePath () );
695- final Class <?> targetPathJavaType = targetPath .getJavaType ();
696- final boolean isEnum = targetPathJavaType != null && targetPathJavaType .isEnum ();
696+ final String targetPathJavaType = targetPath .getJavaTypeName ();
697+ final boolean isEnum = targetPath .isEnum ();
697698 final ParseTree rightSide = ctx .getChild ( 2 );
698699 final HqlParser .ExpressionContext expressionContext ;
699- final Map < Class <?>, Enum <?> > possibleEnumValues ;
700+ final Set < String > possibleEnumValues ;
700701 final SqmExpression <?> value ;
701702 if ( isEnum && rightSide .getChild ( 0 ) instanceof HqlParser .ExpressionContext
702- && ( possibleEnumValues = getPossibleEnumValues ( expressionContext = (HqlParser .ExpressionContext ) rightSide .getChild ( 0 ) ) ) != null ) {
703+ && ( possibleEnumValues = getPossibleEnumTypes ( expressionContext = (HqlParser .ExpressionContext ) rightSide .getChild ( 0 ) ) ) != null ) {
703704 value = resolveEnumShorthandLiteral (
704705 expressionContext ,
705- possibleEnumValues ,
706- targetPathJavaType
706+ getPossibleEnumValue ( expressionContext ),
707+ targetPathJavaType ,
708+ possibleEnumValues
707709 );
708710 }
709711 else {
@@ -2518,21 +2520,23 @@ private SqmComparisonPredicate createComparisonPredicate(
25182520 HqlParser .ExpressionContext rightExpressionContext ) {
25192521 final SqmExpression <?> right ;
25202522 final SqmExpression <?> left ;
2521- Map < Class <?>, Enum <?>> possibleEnumValues ;
2522- if ( ( possibleEnumValues = getPossibleEnumValues ( leftExpressionContext ) ) != null ) {
2523+ Set < String > possibleEnumTypes ;
2524+ if ( ( possibleEnumTypes = getPossibleEnumTypes ( leftExpressionContext ) ) != null ) {
25232525 right = (SqmExpression <?>) rightExpressionContext .accept ( this );
25242526 left = resolveEnumShorthandLiteral (
25252527 leftExpressionContext ,
2526- possibleEnumValues ,
2527- right .getJavaType ()
2528+ getPossibleEnumValue ( leftExpressionContext ),
2529+ right .getJavaTypeName (),
2530+ possibleEnumTypes
25282531 );
25292532 }
2530- else if ( ( possibleEnumValues = getPossibleEnumValues ( rightExpressionContext ) ) != null ) {
2533+ else if ( ( possibleEnumTypes = getPossibleEnumTypes ( rightExpressionContext ) ) != null ) {
25312534 left = (SqmExpression <?>) leftExpressionContext .accept ( this );
25322535 right = resolveEnumShorthandLiteral (
25332536 rightExpressionContext ,
2534- possibleEnumValues ,
2535- left .getJavaType ()
2537+ getPossibleEnumValue ( rightExpressionContext ),
2538+ left .getJavaTypeName (),
2539+ possibleEnumTypes
25362540 );
25372541 }
25382542 else {
@@ -2570,20 +2574,21 @@ private <T> SqmExpression<T> createDiscriminatorValue(
25702574 );
25712575 }
25722576
2573- private SqmExpression <?> resolveEnumShorthandLiteral (HqlParser .ExpressionContext expressionContext , Map <Class <?>, Enum <?>> possibleEnumValues , Class <?> enumType ) {
2574- final Enum <?> enumValue ;
2575- if ( possibleEnumValues != null && ( enumValue = possibleEnumValues .get ( enumType ) ) != null ) {
2577+ private SqmExpression <?> resolveEnumShorthandLiteral (
2578+ HqlParser .ExpressionContext expressionContext ,
2579+ String enumValue , String enumType , Set <String > enumTypes ) {
2580+ if ( enumValue != null && enumType != null && enumTypes .contains (enumType ) ) {
25762581 DotIdentifierConsumer dotIdentifierConsumer = dotIdentifierConsumerStack .getCurrent ();
2577- dotIdentifierConsumer .consumeIdentifier ( enumValue . getClass (). getName () , true , false );
2578- dotIdentifierConsumer .consumeIdentifier ( enumValue . name () , false , true );
2582+ dotIdentifierConsumer .consumeIdentifier ( enumType , true , false );
2583+ dotIdentifierConsumer .consumeIdentifier ( enumValue , false , true );
25792584 return (SqmExpression <?>) dotIdentifierConsumerStack .getCurrent ().getConsumedPart ();
25802585 }
25812586 else {
25822587 return (SqmExpression <?>) expressionContext .accept ( this );
25832588 }
25842589 }
25852590
2586- private Map < Class <?>, Enum <?>> getPossibleEnumValues (HqlParser .ExpressionContext expressionContext ) {
2591+ private Set < String > getPossibleEnumTypes (HqlParser .ExpressionContext expressionContext ) {
25872592 ParseTree ctx ;
25882593 // Traverse the expression structure according to the grammar
25892594 if ( expressionContext instanceof HqlParser .BarePrimaryExpressionContext && expressionContext .getChildCount () == 1 ) {
@@ -2597,7 +2602,29 @@ private Map<Class<?>, Enum<?>> getPossibleEnumValues(HqlParser.ExpressionContext
25972602 ctx = ctx .getChild ( 0 );
25982603
25992604 if ( ctx instanceof HqlParser .SimplePathContext ) {
2600- return creationContext .getJpaMetamodel ().getAllowedEnumLiteralTexts ().get ( ctx .getText () );
2605+ return creationContext .getJpaMetamodel ().getAllowedEnumLiteralTexts ( ctx .getText () );
2606+ }
2607+ }
2608+ }
2609+
2610+ return null ;
2611+ }
2612+
2613+ private String getPossibleEnumValue (HqlParser .ExpressionContext expressionContext ) {
2614+ ParseTree ctx ;
2615+ // Traverse the expression structure according to the grammar
2616+ if ( expressionContext instanceof HqlParser .BarePrimaryExpressionContext && expressionContext .getChildCount () == 1 ) {
2617+ ctx = expressionContext .getChild ( 0 );
2618+
2619+ while ( ctx instanceof HqlParser .PrimaryExpressionContext && ctx .getChildCount () == 1 ) {
2620+ ctx = ctx .getChild ( 0 );
2621+ }
2622+
2623+ if ( ctx instanceof HqlParser .GeneralPathFragmentContext && ctx .getChildCount () == 1 ) {
2624+ ctx = ctx .getChild ( 0 );
2625+
2626+ if ( ctx instanceof HqlParser .SimplePathContext ) {
2627+ return ctx .getText ();
26012628 }
26022629 }
26032630 }
@@ -2689,8 +2716,8 @@ public SqmPredicate visitInPredicate(HqlParser.InPredicateContext ctx) {
26892716 final HqlParser .ExplicitTupleInListContext tupleExpressionListContext = (HqlParser .ExplicitTupleInListContext ) inListContext ;
26902717 final int size = tupleExpressionListContext .getChildCount ();
26912718 final int estimatedSize = size >> 1 ;
2692- final Class <?> testExpressionJavaType = testExpression .getJavaType ();
2693- final boolean isEnum = testExpressionJavaType != null && testExpressionJavaType .isEnum ();
2719+ final String testExpressionJavaType = testExpression .getJavaTypeName ();
2720+ final boolean isEnum = testExpression .isEnum ();
26942721 // Multivalued bindings are only allowed if there is a single list item, hence size 3 (LP, RP and param)
26952722 parameterDeclarationContextStack .push ( () -> size == 3 );
26962723 try {
@@ -2700,14 +2727,15 @@ public SqmPredicate visitInPredicate(HqlParser.InPredicateContext ctx) {
27002727 if ( parseTree instanceof HqlParser .ExpressionOrPredicateContext ) {
27012728 final ParseTree child = parseTree .getChild ( 0 );
27022729 final HqlParser .ExpressionContext expressionContext ;
2703- final Map < Class <?>, Enum <?>> possibleEnumValues ;
2730+ final Set < String > possibleEnumTypes ;
27042731 if ( isEnum && child instanceof HqlParser .ExpressionContext
2705- && ( possibleEnumValues = getPossibleEnumValues ( expressionContext = (HqlParser .ExpressionContext ) child ) ) != null ) {
2732+ && ( possibleEnumTypes = getPossibleEnumTypes ( expressionContext = (HqlParser .ExpressionContext ) child ) ) != null ) {
27062733 listExpressions .add (
27072734 resolveEnumShorthandLiteral (
27082735 expressionContext ,
2709- possibleEnumValues ,
2710- testExpressionJavaType
2736+ getPossibleEnumValue ( expressionContext ),
2737+ testExpressionJavaType ,
2738+ possibleEnumTypes
27112739 )
27122740 );
27132741 }
@@ -3229,9 +3257,14 @@ public Object visitCaseExpression(HqlParser.CaseExpressionContext ctx) {
32293257 final HqlParser .SimpleCaseWhenContext simpleCaseWhenContext = ctx .simpleCaseWhen ( i );
32303258 final HqlParser .ExpressionContext testExpression = simpleCaseWhenContext .expression ();
32313259 final SqmExpression <?> test ;
3232- final Map <Class <?>, Enum <?>> possibleEnumValues ;
3233- if ( ( possibleEnumValues = getPossibleEnumValues ( testExpression ) ) != null ) {
3234- test = resolveEnumShorthandLiteral ( testExpression , possibleEnumValues , expression .getJavaType () );
3260+ final Set <String > possibleEnumTypes ;
3261+ if ( ( possibleEnumTypes = getPossibleEnumTypes ( testExpression ) ) != null ) {
3262+ test = resolveEnumShorthandLiteral (
3263+ testExpression ,
3264+ getPossibleEnumValue ( testExpression ),
3265+ expression .getJavaTypeName (),
3266+ possibleEnumTypes
3267+ );
32353268 }
32363269 else {
32373270 test = (SqmExpression <?>) testExpression .accept ( this );
0 commit comments