MySQL 将允许我将条件作为参数传递给 SUM()。
SELECT COUNT(*), SUM(value > 100) FROM TABLE1;
如this answer中所示。
如何在 JOOQ 中执行此操作?
最佳答案
目前(自 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.Condition
进入 org.jooq.Field
通过调用 DSL.field(Condition)
。当使用 MySQL 时,这对生成的 SQL 没有影响,MySQL 本身支持 boolean 类型的这种用法。如果您使用的数据库不支持 boolean 类型,DSL.field(Condition)
将生成 CASE
表达。
在 jOOQ 4.0 ( Issue #3415 ) 中,DSL.sum()
函数计划放宽参数类型约束,以便调用 coerce()
或转换为 (Field)
不再需要。
关于java - jOOQ 中带有条件的 MySQL sum(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24784922/