2011-05-30 51 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方法中获取。