MySQL sum()条件在jOOQ中

时间:2014-07-16 15:35:11

标签: java mysql sql jooq

MySQL允许我将条件作为参数传递给SUM()。

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

this answer所示。

我如何在JOOQ中执行此操作?

1 个答案:

答案 0 :(得分:3)

目前(截至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();

在这两种解决方案中,您都需要通过调用org.jooq.Conditionorg.jooq.Field转换为DSL.field(Condition)。当使用MySQL本身支持布尔类型的这种用法时,这对生成的SQL没有影响。如果您使用的数据库不支持布尔类型,DSL.field(Condition)将生成CASE表达式。

在jOOQ 4.0(Issue #3415)中,DSL.sum()函数被安排放宽参数类型约束,以便不再调用coerce()或转换为(Field)。需要的。