java - jOOQ 中带有条件的 MySQL sum()

标签 java mysql sql jooq

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/

相关文章:

java - 未找到 Paypal 沙箱集成 API 凭据

java - 将 Java 应用程序放入 Mac OS X 上的 Dock

Null 值的 Java Criteria 构建器

mysql - 尝试使用 DataGrip 连接到 MySQL 实例时如何修复导致异常的服务器时区?

sql - 遍历SQL Server 2008中的行

java - 使用Streams为列表的每个元素调用方法

java - 正则表达式向后匹配最近的字符

php - 如何在php中添加用户角色

php - 如何将循环中的这两个查询转换为单个 JOINed 查询?

mysql - 根据 MySQL 中的 WHERE 子句创建具有不同值的重复更新