Grails标准的复杂投影

时间:2016-06-21 16:25:29

标签: hibernate grails hibernate-criteria

我在Grails(或只是Hibernate)标准表单中搜索表达以下SQL的方式。

index.php

这里我想获得由特定列定义的不同行的子集的两个总和。目标是将它们放在一个请求中。

好吧,看一下Projections类,我发现它只提供了一个属性的基本总和聚合,所以预期的答案是否定的,但是什么可能是最好的解决方案?

2 个答案:

答案 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

它对我有用,希望这有帮助。