我正在寻找在Grails (或者仅仅是Hibernate)标准表单中表示以下SQL的方法。
select 
    sum(if( r.type = 'a', r.amount, 0)) as sum_a,    
    sum(if( r.type = 'b', r.amount, 0)) as sum_b    
from records r;在这里,我想得到由特定列定义的不同行子集的两个和。我们的目标是在单个请求中获得它们。
好吧,看看Projections类,我看到它只提供了一个属性的基本总和,所以预期的答案是否定的,但是对于这个问题,什么是最好的解决方案呢?
发布于 2016-06-28 17:12:59
你应该看看sqlProjection,它允许你写一些原生的投影。
也许它看起来像这样:
Projections.sqlProjection("sum(if( {alias}.type = 'a', {alias}.amount, 0)) as sum_a",   new String[] { "sum_a" }, new Type[] { StandardBasicTypes.INTEGER})发布于 2017-10-24 21:04:18
可以在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这对我很有效,希望这对我有帮助。
https://stackoverflow.com/questions/37949785
复制相似问题