2016-06-21 2 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; 

여기서 특정 열로 정의 된 행의 서로 다른 하위 집합에 대해 두 개의 합계를 가져 오려고합니다. 목표는 단일 요청으로 그들을 얻는 것입니다.

예를 들어 Projections 클래스를 살펴보면 속성에 대한 기본 총계 만 제공되므로 예상 답변은 아니지만이 경우 가장 좋은 해결책은 무엇일까요?

답변

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

당신은 다음과 같이 sqlGroupProjection 표현 내부 CASE...WHEN 최대 절전 문을 사용할 수 있습니다

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 

을 그것은 나를 위해 작동, 이것이 도움이되기를 바랍니다.