QueryDsl - 具有字符串值的case表达式

wie*_*cia 7 java hibernate querydsl

QueryDsl 3.3.4
Hibernate 3.6.10-Final我有两个实体:

public class Document {
    private Confirmation confirmation;
}

public class Confirmation {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我需要这样的查询:

SELECT count(d.id), CASE WHEN d.confirmation_id IS NULL then 'NOT_CONFIRMED' else 'CONFIRMED' END as confirmed FROM document d GROUP BY confirmed;
Run Code Online (Sandbox Code Playgroud)

所以它应该按照上面的case表达式的结果进行分组.
现在,将案例部分翻译为querydsl:

StringExpression confirmExp = new CaseBuilder()
    .when(Expressions.booleanTemplate("confirmation_id is null"))
    .then(Expressions.stringTemplate("NOT_CONFIRMED"))
    .otherwise(Expressions.stringTemplate("CONFIRMED"));
Run Code Online (Sandbox Code Playgroud)

我正在使用.when(Expressions.booleanTemplate("confirmation_id is null"))以避免加入confirmation桌面.使用这样的表达式运行查询我在下面得到一个例外.
这是另一个hibernate错误或这种情况需要不同吗?

java.lang.IllegalStateException:没有节点的数据类型:> org.hibernate.hql.ast.tree.CaseNode + - [CASE] CaseNode:'case'| + - [WHEN] SqlNode:'when'| | + - [IS_NULL] IsNullLogicOperatorNode:'为null'| | | - [IDENT] IdentNode:'confirmation_id'{originalText = confirmation_id} | | - [IDENT] IdentNode:'NOT_CONFIRMED'{originalText = NOT_CONFIRMED} | - [ELSE] SqlNode:'else'| - [IDENT] IdentNode:'CONFIRMED'{originalText = CONFIRMED}

org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:156)

Tim*_*per 13

如果您想在查询中使用字符串文字,则需要将其写为

StringExpression confirmExp = new CaseBuilder()
    .when(Expressions.booleanTemplate("confirmation_id is null"))
    .then(Expressions.stringTemplate("'NOT_CONFIRMED'"))
    .otherwise(Expressions.stringTemplate("'CONFIRMED'"));
Run Code Online (Sandbox Code Playgroud)

Expressions.stringTemplate并不意味着参数被序列化为String文字,但创建的表达式的类型为java.lang.String.

  • 是的,这成功了,我没有意识到这一点。再次感谢@timo-westkamper!顺便说一句 - 是否可以以某种方式为这个 case exp 起别名,以便在组和 order 子句中使用别名,而不是使用整个 exp 3 次? (2认同)