2014-07-16 13 views
1

MySQL에서는 SUM()에 대한 매개 변수로 조건을 전달할 수 있습니다.MySQL sum() with jOOQ

SELECT COUNT(*), SUM(value > 100) FROM TABLE1; 

this answer에서 보여지는 것과 같이.

어떻게하면 JOOQ에서이 작업을 수행 할 수 있습니까?

답변

2

현재 (jOOQ 3.4에서) DSL.sum() 함수는 Field<? extends Number> 인수를 취하므로 유형에 대한 조정이 필요합니다. 두 솔루션에서

// Static imports are assumed to be present: 
import static org.jooq.impl.DSL.*; 

DSLContext ctx = using(configuration); 

// Solution 1) Coerce Field<Boolean> to Field<Number> 
ctx.select(count(), sum(field(TABLE1.VALUE.gt(100)).coerce(Integer.class))) 
    .from(TABLE1) 
    .fetch(); 

// Solution 2) Resort to a raw type cast 
ctx.select(count(), sum((Field) field(TABLE1.VALUE.gt(100)))) 
    .from(TABLE1) 
    .fetch(); 

당신이 DSL.field(Condition)를 호출하여 org.jooq.Field 내로 org.jooq.Condition 변환해야합니다 : 여기에 해당 쿼리를 구현하는 두 가지 다른 방법이 있습니다. 이것은 부울 유형에 대해 이러한 종류의 사용을 기본적으로 지원하는 MySQL을 사용할 때 생성 된 SQL에 영향을 미치지 않습니다. 부울 유형에 대한 지원이없는 데이터베이스를 사용하는 경우 DSL.field(Condition)CASE 표현식을 생성합니다. coerce()에 전화 또는 (Field)에 캐스트가 더 이상 필요하지 않도록 jOOQ 4.0 (Issue #3415)에서

DSL.sum() 함수는 인수 유형의 제약 조건을 완화 할 예정되지 않습니다.

+0

해결책 1을 수행하면 "org.jooq.exception.SQLDialectNotSupportedException : Type 클래스 java.lang.Number가 dialect null에서 지원되지 않습니다."라는 예외가 발생합니다. 나는 버전 3.4.1을 사용하고있다. – Victor

+1

그래, 네가 맞아. 클래스를 'Integer.class'로 변경했습니다. –

+0

그랬습니다! 감사. – Victor