开发者问题收集

JOOQ 中是否实现了 setFixedCHAR()

2016-04-25
75

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

    String foo = "foo"

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

有什么方法可以告诉 jooq foo 是一个字符,因此它会执行填充比较,例如在 rusty 中,机器人回答 这里

1个回答

您可以为所有 CHAR 列实现 数据类型绑定 ,并在生成的 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

或者在将绑定变量绑定到准备好的语句之前缩短/填充绑定变量。或者您可以 直接在数据类型绑定的变量绑定逻辑中使用您引用的逻辑

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

上述任何一种方法都只允许您实现一次该逻辑。

Lukas Eder
2016-04-26