2016-06-21 5 views
0

次のSQLをGrails(または単にHibernate)の基準フォームで表現する方法を探しています。Grails基準の複合投影

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; 

ここでは、特定の列で定義された行の異なるサブセットに対して2つの合計を取得したいとします。目標は、単一の要求でそれらを取得することです。

プロジェクションクラスを見ると、プロパティの基本集計のみが提供されるため、予想される回答は「いいえ」ですが、これには最適な解決策がありますか?

答えて

0

sqlProjectionを見ると、ネイティブプロジェクションを書くことができます。

多分それは次のようになり北韓:

Projections.sqlProjection("sum(if({alias}.type = 'a', {alias}.amount, 0)) as sum_a", new String[] { "sum_a" }, new Type[] { StandardBasicTypes.INTEGER}) 
+0

Groovy言語では、Groovyがクロージャーの中括弧を保持するので、java構文(new String []、 "one"、 "two"}を使用して配列を作成することはできませんが、代わりにこの構文を使用できます:["one"、 "two "] .toArray() – bitsnaps

0

あなたはCASE...WHENは、このようなsqlGroupProjection式の中の文を休止状態使用することができます。

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 

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を生成し、それは私のために働く、これが助けて欲しい。

関連する問題