JOOQ中CASE WHEN/IIF语法如何传入表字段实现MySQL IF查询逻辑
问题原因
你遇到的报错主要来自3个错误:
- jOOQ的
whenAPI不支持直接传三个参数,正确用法是链式调用when(条件).then(匹配返回值).otherwise(不匹配返回值) left函数的第二个参数要求是整数类型,你给msg.maxLength指定了String.class类型,类型不匹配- 语法错误:括号未闭合,
message别名的放置位置错误,不应该绑定到maxLength字段上,应该绑定到整个left函数结果上
正确实现代码
import static org.jooq.impl.DSL.*; public Message getMessageTest(String tableName) { // 先给动态传入的表绑定别名msg,避免硬编码字段的绑定错误 Table<?> msg = table(name(tableName)).as("msg"); return roDslContext.select( // 取别名表的index字段 field(msg.field("index")).as("index"), left( field(msg.field("message"), String.class), // 正确的when链式写法,明确指定字段类型为Integer when(field(msg.field("type"), Integer.class).eq(1), 10) .otherwise(field(msg.field("maxLength"), Integer.class)) ).as("message") ) .from(msg) .fetchOneInto(Message.class); }
替换为IIF写法的实现
如果你更习惯用和MySQL if对应的iif语法,替换when部分即可:
iif(field(msg.field("type"), Integer.class).eq(1), 10, field(msg.field("maxLength"), Integer.class))
额外优化建议
因为你的两张表结构完全一致,建议生成jOOQ的表实体类,替换动态字符串传表名的写法,能实现编译期类型校验,避免字段名、表名写错的问题。
内容的提问来源于stack exchange,提问作者JoneNa
相关产品推荐
相关产品推荐

