让 QueryDSL 的构造函数使用常量而不是参数
Have QueryDSL's constructor use a constant instead of a parameter
我使用 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 按原样发送字符串吗?
我会回答我自己的问题。
QueryDSL 的开发人员回答此行为是 Hibernate 中的错误,他们不能/不会在 QueryDSL 中修复它。我找到的解决方案是使用 stringTemplate
和带引号的字符串:
final Expression<String> TOTAL = Expressions.stringTemplate("'total'");
我使用 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 按原样发送字符串吗?
我会回答我自己的问题。
QueryDSL 的开发人员回答此行为是 Hibernate 中的错误,他们不能/不会在 QueryDSL 中修复它。我找到的解决方案是使用 stringTemplate
和带引号的字符串:
final Expression<String> TOTAL = Expressions.stringTemplate("'total'");