2010-01-19 52 views
2

我想在HQL执行以下查询:使用功能处于休眠聚集函数的参数

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

然而,这会导致以下异常:

org.hibernate.hql。 ast.QuerySyntaxException: 期待CLOSE,发现 '(' 近线 1,列27

看来THA休眠不允许使用函数作为其聚合函数的参数。有什么方法可以获得所需的结果吗?

+0

我仍然有兴趣知道这是否只能在纯HQL中实现。 – samik 2010-01-19 12:14:13

回答

0
  1. 选择整个日期
  2. 遍历结果和提取每个日期

由今年初听起来无效的一个新的集合,但当时它只是一个额外为O(n ),我猜N不是那么大。

另一种方法是使用本机SQL查询。

+0

感谢您的回答。但是,对于第三方软件的兼容性问题,我希望能够在单个查询中完成。我想知道是否可以做到。 – samik 2010-01-19 08:46:04

+0

使用本机SQL查询(不是HQL) – Bozho 2010-01-19 08:53:59

+0

确定找到一种方法将此建议应用于我的代码。谢谢。 – samik 2010-01-19 12:10:58

0

随着标准的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投影的唯一问题是您必须知道(即重复)列名称。

+0

感谢您指出使用hibernate投影的可能性。必须深入研究它们! – samik 2010-01-19 12:12:41