【问题标题】:Have QueryDSL's constructor use a constant instead of a parameter让 QueryDSL 的构造函数使用常量而不是参数
【发布时间】:2015-11-05 14:32:24
【问题描述】:

我使用 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 按原样发送字符串吗?

【问题讨论】:

    标签: java hibernate querydsl


    【解决方案1】:

    我会回答我自己的问题。

    QueryDSL 的开发者回答说这种行为是 Hibernate 中的一个错误,他们不能/不会在 QueryDSL 中修复它。我找到的解决方案是使用 stringTemplate 带引号的字符串:

    final Expression<String> TOTAL = Expressions.stringTemplate("'total'");
    

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多