我有一个表,其中一列是布尔类型,我需要在另一列上使用group by projection。现在我想要选择列表中的所有列。所以我需要在所有列上使用聚合函数。
在布尔类型列的情况下应该使用什么?
答案 0 :(得分: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方法中获取。