2010-01-19 51 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