【问题标题】:Using functions as arguments in hibernate aggregation functions在休眠聚合函数中使用函数作为参数
【发布时间】:2010-01-19 08:31:20
【问题描述】:

我想在 HQL 中执行以下查询:

select count(distinct year(foo.date)) from Foo foo  

但是,这会导致以下异常:

org.hibernate.hql.ast.QuerySyntaxException: 期待 CLOSE,发现 '(' 在行附近 1,第 27 栏

似乎hibernate不允许使用函数作为其聚合函数的参数。有什么方法可以得到所需的结果?

【问题讨论】:

  • 我仍然想知道这是否可以仅在纯 HQL 中实现。

标签: java hibernate orm hql


【解决方案1】:
  1. 选择整个日期
  2. 循环结果并从每个日期提取一个由年份组成的新集合

一开始听起来没什么效果,但后来它只是一个额外的 O(n),我猜 N 并没有那么大。

另一种方法是使用原生 SQL 查询。

【讨论】:

  • 感谢您的回答。但是,对于与第三方软件的兼容性问题,我希望能够在单个查询中完成。我想知道它是否可以完成。
  • 使用原生 SQL 查询(不是 HQL)
【解决方案2】:

有条件的 API 可以使用 sqlProjection:

String func = format("count(distinct year(%s_.date))", criteria.getAlias());
String alias = "dateCol";
session.createCriteria(Foo.class).setProjection(
    sqlProjection(
        format("%s as %s", func, alias),
            new String[] { alias }, 
            new Type[] { Hibernate.LONG }
         )
     )
 );

这应该可行。我没有测试过。

sql 投影的唯一问题是您必须知道(即重复)列名。

【讨论】:

  • 感谢您指出使用休眠投影的可能性。将不得不更深入地研究它们!
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 2020-12-11
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 2015-11-07
相关资源
最近更新 更多