我在Grails(或只是Hibernate)标准表单中搜索表达以下SQL的方式。
index.php
这里我想获得由特定列定义的不同行的子集的两个总和。目标是将它们放在一个请求中。
好吧,看一下Projections类,我发现它只提供了一个属性的基本总和聚合,所以预期的答案是否定的,但是什么可能是最好的解决方案?
答案 0 :(得分:0)
您应该查看sqlProjection,它允许您编写一些原生投影。
也许它看起来像这样:
Projections.sqlProjection("sum(if( {alias}.type = 'a', {alias}.amount, 0)) as sum_a", new String[] { "sum_a" }, new Type[] { StandardBasicTypes.INTEGER})
答案 1 :(得分:0)
您可以在sqlGroupProjection
表达式中使用CASE...WHEN hibernate语句,如下所示:
Records.createCriteria().list{
projections {
sqlGroupProjection '(case type when \'a\' then sum(amount) else 0 end) as sum_a, (case type when \'b\' then sum(amount) else 0 end) as sum_b', 'type', ['sum_a', 'sum_b'], [INTEGER, INTEGER]
}
}
这将生成以下SQL:
select (case type when 'a' then sum(amount) else 0 end) as sum_a, (case type when 'b' then sum(amount) else 0 end) as sum_b from records this_ group by type
它对我有用,希望这有帮助。