Search code examples
javahibernatequerydsl

QueryDSL: CaseBuilder Ambiguous method call and unexpected AST node


My project with springBootVersion 2.5.7, querydsl 5.0.0

have some code:

.or(
    Expressions.cases()
            .when(intervalTo.isNotNull())
            .then(
                    enablePath
                            .after(intervalFrom)
                            .and(enablePath.before(intervalTo))
            )
            .otherwise(
                    enablePath.after(intervalFrom)
            )
);
  1. in .then expression i have compile error with Ambiguous method call. (Both then (Predicate) and then (ComparableExpression<Boolean>))
  2. after casting arguments to Predicate i have error:

<AST>:6:588: unexpected AST node: case antlr.NoViableAltException: unexpected AST node: case at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2174) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2119) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2094) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:832) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:626)

What's my mistake? thank in advance


Solution

  • it was my fail, case must return some value:

    .or(
            Expressions.cases()
                    .when(intervalTo.isNotNull())
                    .then(
                            Expressions.cases().when(enablePath.after(intervalFrom)
                                            .and(enablePath.before(intervalTo))
                                    ).then(1)
                                    .otherwise(0)
                    )
                    .otherwise(
                            Expressions.cases().when(enablePath.after(intervalFrom)).then(1)
                                    .otherwise(0)
                    ).eq(1)
    );