我使用QueryDSL来构建查询。结果必须注入对象内部。第一列是groupBy,第二列是值,第三列是常量。
常量是一个问题,因为QueryDSL想要使它成为一个参数,这会导致Hibernate出现这个错误:
org.hibernate.QueryException:
Parameters are only supported in SELECT clauses when used as part of a INSERT INTO DML statement
[select event.datetime, count(event), ?1]
"?1"上面应该直接是一个常量字符串" TOTAL"。
这是我的代码:
final Expression<String> TOTAL = Expressions.constant("total");
final StringExpression date = Expressions.stringTemplate("DATE_FORMAT({0},'%Y-%m-%d')", event.datetime);
query.select(Projections.constructor(Stat2DGraphDto.class, date, event.count(), TOTAL))
query.from(event).groupBy(date);
query.fetch();
如果我从构造函数中删除TOTAL,它会按预期工作,但是我需要这个常量来稍后准备一个UNION。
我可以强制QueryDSL发送String as-this吗?
答案 0 :(得分:2)
我会回答我自己的问题。
QueryDSL的开发人员回答了这种行为是Hibernate中的一个错误,他们无法在QueryDSL中修复它。我找到的解决方案是使用带引号字符串的stringTemplate
:
final Expression<String> TOTAL = Expressions.stringTemplate("'total'");