mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-24 12:17:24 +00:00
HHH-17748 accept abbreviated enum value names in HQL 'when' clause
This commit is contained in:
parent
bfda1c6142
commit
777dede7da
@ -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();
|
||||
|
@ -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")
|
||||
|
Loading…
x
Reference in New Issue
Block a user