setFixedCHAR() 是不是在 JOOQ 中实现

Posted

技术标签:

【中文标题】setFixedCHAR() 是不是在 JOOQ 中实现【英文标题】:Is setFixedCHAR() implemented in JOOQsetFixedCHAR() 是否在 JOOQ 中实现 【发布时间】:2016-04-25 18:29:35 【问题描述】:

我们的 oracle 数据库无法更改,并且有很多以 CHARS 表示的列。目前,我在进行比较时手动将参数填充到字段的长度,例如给定 foo 是 db 'foo' 中的 char(5)

    String foo = "foo"

...    
        .where(FOO_TABLE.FOO.equal(StringUtils.rightPad(foo,FOO_TABLE.FOO.getDataType().length()))

有什么方法可以告诉 jooq foo 是一个字符,因此它会执行填充比较,例如在 rusty the robots answer here

【问题讨论】:

【参考方案1】:

您可以为所有CHAR 列实现data type binding,并在生成的SQL 字符串中强制转换绑定变量:

@Override
public final void sql(BindingSQLContext<String> ctx) throws SQLException 
    ctx.render().sql("CAST(? AS CHAR(5))");

(我刚刚注意到无法通过这种方式访问​​CHAR 长度...,这应该修复:https://github.com/jOOQ/jOOQ/issues/5223)

或者在将绑定变量绑定到准备好的语句之前缩短/填充绑定变量。或者您可以直接在数据类型绑定的变量绑定逻辑中use that logic you referenced to。

@Override
public final void set(BindingSetStatementContext<String> ctx) throws SQLException 
    ctx.statement()
       .unwrap(OraclePreparedStatement.class)
       .setFixedChar(ctx.index(), ctx.value());

这些方法中的任何一种都只允许您实现此逻辑一次。

【讨论】:

以上是关于setFixedCHAR() 是不是在 JOOQ 中实现的主要内容,如果未能解决你的问题,请参考以下文章

jOOQ 是不是支持在 SQL 语句上添加名称?

在 JOOQ 中,如果我直接使用底层连接,我的事务状态是不是保持不变?

jOOQ 3.15.1 新的 ad-hoc 转换 API 是不是在 Kotlin 中工作?

如何在jooq查询的左连接中检查记录是不是完​​全为空

在 try-with-resources 块之外流式传输 JOOQ 结果时,我是不是会冒 JDBC 连接泄漏的风险?

jOOQ 是不是使用不同的连接来执行不同的查询?