HHH-17748 accept abbreviated enum value names in HQL 'when' clause

This commit is contained in:
Gavin King 2024-02-18 22:14:44 +01:00
parent bfda1c6142
commit 777dede7da
2 changed files with 29 additions and 9 deletions

View File

@ -3205,18 +3205,23 @@ public Object visitCaseExpression(HqlParser.CaseExpressionContext ctx) {
@Override @SuppressWarnings({"rawtypes", "unchecked"})
public SqmCaseSimple<?, ?> visitSimpleCaseList(HqlParser.SimpleCaseListContext ctx) {
final int size = ctx.simpleCaseWhen().size();
final SqmCaseSimple caseExpression = new SqmCaseSimple<>(
(SqmExpression<?>) ctx.expressionOrPredicate().accept( this ),
size,
creationContext.getNodeBuilder()
);
final SqmExpression<?> expression = (SqmExpression<?>) ctx.expressionOrPredicate().accept(this);
final SqmCaseSimple caseExpression = new SqmCaseSimple<>( expression, size, creationContext.getNodeBuilder() );
for ( int i = 0; i < size; i++ ) {
final HqlParser.SimpleCaseWhenContext simpleCaseWhenContext = ctx.simpleCaseWhen( i );
caseExpression.when(
(SqmExpression<?>) simpleCaseWhenContext.expression().accept( this ),
(SqmExpression<?>) simpleCaseWhenContext.expressionOrPredicate().accept( this )
);
final HqlParser.ExpressionContext testExpression = simpleCaseWhenContext.expression();
final SqmExpression<?> test;
final Map<Class<?>, Enum<?>> possibleEnumValues;
if ( ( possibleEnumValues = getPossibleEnumValues( testExpression ) ) != null ) {
test = resolveEnumShorthandLiteral( testExpression, possibleEnumValues, expression.getJavaType() );
}
else {
test = (SqmExpression<?>) testExpression.accept( this );
}
final SqmExpression<?> result =
(SqmExpression<?>) simpleCaseWhenContext.expressionOrPredicate().accept(this);
caseExpression.when( test, result );
}
final HqlParser.CaseOtherwiseContext caseOtherwiseContext = ctx.caseOtherwise();

View File

@ -20,6 +20,7 @@ public class EnumComparisonTest {
@Test
void test(SessionFactoryScope scope) {
scope.inTransaction(session -> {
session.createMutationQuery("delete WithEnum").executeUpdate();
session.persist(new WithEnum());
assertEquals(1,
session.createSelectionQuery("from WithEnum where stringEnum > X").getResultList().size());
@ -46,6 +47,20 @@ void test(SessionFactoryScope scope) {
});
}
@Test
void testCase(SessionFactoryScope scope) {
scope.inTransaction(session -> {
session.createMutationQuery("delete WithEnum").executeUpdate();
session.persist(new WithEnum());
assertEquals(2,
session.createSelectionQuery("select case stringEnum when X then 1 when Y then 2 when Z then 3 else -1 end from WithEnum", Integer.class)
.getSingleResult());
assertEquals(3,
session.createSelectionQuery("select case ordinalEnum when X then 1 when Y then 2 when Z then 3 else -1 end from WithEnum", Integer.class)
.getSingleResult());
});
}
enum Enum { X, Y, Z }
@Entity(name = "WithEnum")