【发布时间】:2011-05-30 11:21:26
【问题描述】:
我有一个表,其中一列是布尔类型,我需要在另一列上使用按投影分组。现在我想要选择列表中的所有列。所以我需要在所有列上使用聚合函数。
如果是布尔类型的列应该使用什么?
【问题讨论】:
标签: hibernate aggregate-functions projection
我有一个表,其中一列是布尔类型,我需要在另一列上使用按投影分组。现在我想要选择列表中的所有列。所以我需要在所有列上使用聚合函数。
如果是布尔类型的列应该使用什么?
【问题讨论】:
标签: hibernate aggregate-functions projection
Hibernate 中的聚合通过 SQL 中的聚合直接映射到相应的组,因此答案取决于如果您直接在 SQL 中编写查询,您将应用于布尔列的 SQL 聚合函数。
Projections 类中的基本聚合函数通常是数值型的。您可以使用 count 但这只会计算组中有多少行具有非空值,这似乎不是很有用。但是,我所知道的聚合函数都不会产生布尔值,因此您可能必须做一些自定义的事情。
通过扩展 AggregateProjection 类,您可以提供用于投影的自定义 SQL 子句。通常,这将用于访问特定于平台的聚合函数(例如 STDDEV_POP),但您可以提供可以在 SQL 查询中使用的任何有效 SQL 片段。例如,如果您想实现逻辑 OR(如果组中的任何行具有真值,则为真),您可以使用类似
if(sum(if(boolean_column,1,0))>0,true,false)
作为自定义投影的 toSqlString 方法返回的值。然后,您可以像使用 Projections 类中的任何标准选项一样使用此自定义类。
这个类的实现有点棘手,因为您必须确保您在字符串中使用的值是正确的 Hibernate 列别名,这很容易从 AggregateProjection 的受保护的 getColumnAlias 方法中获取。
【讨论】: