2011-05-30 93 views
3

我有一個表格,其中一列爲布爾類型,我需要在另一列上使用投影。現在我想要選擇列表中的所有列。所以我需要在所有列上使用聚合函數。需要在休眠時聚合布爾類型列值

在布爾型列中應該使用什麼?

回答

0

Hibernate中的聚合直接通過SQL中的聚合直接映射到相應的組,因此如果您直接在SQL中編寫查詢,則答案基於您將應用於布爾列的SQL聚合函數。

Projections類中的基本聚合函數本質上通常是數字。你可以使用count,但是這隻會計算組中有多少行具有非空值,這似乎不是很有用。我所知道的任何聚合函數都沒有產生布爾值,所以你可能不得不做一些自定義的事情。

通過擴展AggregateProjection類,您可以提供用於投影的自定義SQL子句。通常,這將用於訪問特定於平臺的聚合函數(例如STDDEV_POP),但您可以提供任何可用於SQL查詢的有效SQL片段。例如,如果你想實現一個邏輯OR(true,如果該組中的任何行有一個真正的價值),你可以使用類似

if(sum(if(boolean_column,1,0))>0,true,false) 

從您的自定義投影toSqlString方法的返回值。然後,您將使用此自定義類,就像使用Projections類中的任何標準選項一樣。

這個類的實現有點棘手,因爲您必須確保您在字符串中使用的值是正確的Hibernate列別名,這很容易從AggregateProjection的受保護getColumnAlias方法中獲取。