2012-04-18 88 views
1

我想有一個HQL查詢基本上做到這一點:多個集合函數

select quarter, sum(if(a>1, 1, 0)) as res1, sum(if(b>1, 1, 0)) as res2 from foo group by quarter; 

我希望有一個清單,我輸出列表與Summary Class ->

Class Summary 
{ 
long res1; 
long res2; 
int quarter; 
} 

我怎樣才能做到這一點在HQL中聚合?目標對象的hibernate映射是什麼? 我不想使用SQL類型的查詢,它將返回List<Object[]>,然後將其轉換爲List<Summary>

回答

2

由於Summary不是一個實體,所以您不需要映射它,您可以創建一個合適的構造函數並使用HQL構造函數表達式來代替。彙總功能和if也是可能的,但您需要使用case語法而不是if

所以,如果Foo是映射表Foo它是這樣一個實體:

select new Summary(
    f.quarter, 
    sum(case when f.a > 1 then 1 else 0 end), 
    sum(case when f.b > 1 then 1 else 0 end) 
) from Foo f group by f.quarter 

參見:

+0

哇。這個看起來很有希望。謝謝。我會試試看。 – 2012-04-19 13:17:26

0

在映射中使用子查詢可能是可能的。在hibernate文檔中查看More complex association mappings。我從來沒有嘗試過這種可能性。

即使冬眠傢伙推薦「......但它是更實際的處理這些使用HQL或條件查詢的情況下」這就是我會做的:在HQL語句中使用group-by並與列表一起工作。將該列表複製到合適對象列表中的額外時間與group-by在數據庫中使用的時間相比可以忽略不計。但似乎你不喜歡這種可能性。

第三種可能性是在包含group-by的數據庫中定義一個視圖,然後爲該視圖創建一個法線映射。