jooq中的Case When或iif语法表达式
Posted
技术标签:
【中文标题】jooq中的Case When或iif语法表达式【英文标题】:Case When or iif syntax expression in jooq 【发布时间】:2021-12-08 21:03:37 【问题描述】:我正在尝试在 jooq 中重现这个 mysql 查询。
messageTable1、messageTable2 同列
select
msg.index as index,
left(msg.message, if(msg.type = 1, 10, msg.maxLength)) as message
from
messageTable1 as msg
select
msg.index as index,
left(msg.message, if(msg.type = 1, 10, msg.maxLength)) as message
from
messageTable2 as msg
制作函数java
public Message getMessageTest(String tableName)
return roDslContext.select(
DSL.field("msg.index").as("index"),
left(DSL.field( "0", String.class, "msg.message"),
when(DSL.field("msg.type").eq(1), 10, DSL.field( "0", String.class, "msg.maxLength").as("message)
.from(tableName)
.fetchOneInto(Message.class);
但是....
when(DSL.field("msg.type").eq(1), 10, DSL.field( "0", String.class, "msg.maxLength").as("message)
jooq 是字段 msg.maxLength ... 不接受
也是如此
如何,何时,iif插入字段列数据??
【问题讨论】:
tableName -> "messageTable1" 或 "messageTable2" 【参考方案1】:使用code generator
我假设您在此示例中没有使用代码生成器,因为您希望根据表名使列引用动态化。
有可能在您的表上生成通用接口,这将对两种表类型进行抽象。此外,在这些表上生成了Table.rename(String)
方法,这些方法允许重命名表MESSAGE_TABLE_1.rename("message_table_2")
。所以您的查询将如下所示:
public Message getMessageTest(String tableName)
MessageTable1 msg = MESSAGE_TABLE_1.rename(tableName);
return roDslContext
.select(
msg.INDEX,
left(msg.MESSAGE, if_(msg.TYPE.eq(1), val(10), msg.MAX_LENGTH))
)
.from(msg)
.fetchOneInto(Message.class);
与往常一样,这是假设以下静态导入:
import static org.jooq.impl.DSL.*;
实际问题
您似乎正在尝试使用plain SQL templating 构造字段引用。你通过DSL.field("msg.index")
为msg.index
做对了,但不知何故,msg.message
的模板语法被绊倒了。这没有意义:
field("0", String.class, "msg.message");
使用模板时,占位符0
需要替换为QueryPart
实例。您不能只传递 String
(这将被解释为绑定值)。您在这里的意思是:
// If you really need templating, though here, you don't:
field("0", String.class, name("msg", "message"));
// Instead, just do this, if you want quoted names:
field(name("msg", "message"), String.class);
// Or this, if you don't care about quoting the name
field("msg.message", String.class);
【讨论】:
我解决了。谢谢卢卡斯。以上是关于jooq中的Case When或iif语法表达式的主要内容,如果未能解决你的问题,请参考以下文章