【问题标题】:JOOQ generates CHAR OCTETS columns as CHAR instead of BINARYJOOQ 将 CHAR OCTETS 列生成为 CHAR 而不是 BINARY
【发布时间】:2018-12-06 18:11:54
【问题描述】:

我的问题与Using UUID PK or FK in Firebird with Jooq中提到的问题非常接近

设置: Jaybird 3.0.5、火鸟 2.5.7、jOOQ 3.11.7、JDK 1.8

我的 PK 和 FK 字段,例如

ID CHAR(16) CHARACTER SET OCTETS NOT NULL

TABLE_ID CHAR(16) CHARACTER SET OCTETS

我想在生成的类中使用 UUID 作为 java 数据类型

我在配置中使用 JDBC 连接

<jdbc>
    <driver>org.firebirdsql.jdbc.FBDriver</driver>
    <url>jdbc:firebirdsql:localhost:c:/DBS/DB.FDB?octetsAsBytes=true</url>
    <properties>
        <property>
            <key>user</key>
            <value>SYSDBA</value>
        </property>
        <property>
            <key>password</key>
            <value>masterkey</value>
        </property>
    </properties>
</jdbc>

我已经在生成器中设置了forcedType,比如

<forcedType>
    <userType>java.util.UUID</userType>
    <binding>com.ekser.nakkash.icdv.converters.jooq.ByteArray2UUIDBinding</binding>
    <expression>.*ID$</expression>
    <types>CHAR\(16\)</types>
    <nullability>ALL</nullability>
</forcedType>

我有课

class ByteArray2UUIDBinding implements Binding<byte[], UUID>

现在的问题

jOOQ 生成

public final TableField<MyTableRecord, UUID> ID = createField("ID", org.jooq.impl.SQLDataType.CHAR(16).nullable(false), this, "", new ByteArray2UUIDBinding());

问题是SQLDataType.CHAR(16),应该是SQLDataType.BINARY(16)

jOOQ 将我的 char(16) octets 字段翻译为字符串 (char(16)),它不尊重 octetsAsBytes=true

我试图把它放在&lt;jdbc&gt; 中的属性中

<jdbc>
    <driver>org.firebirdsql.jdbc.FBDriver</driver>
    <url>jdbc:firebirdsql:localhost:c:/DBS/DB.FDB</url>
    <properties>
        <property>
            <key>user</key>
            <value>SYSDBA</value>
        </property>
        <property>
            <key>password</key>
            <value>masterkey</value>
        </property>
        <property>
            <key>octetsAsBytes</key>
            <value>true</value>
        </property>
    </properties>
</jdbc>

结果相同。

怎么了? 我正在考虑暂时在生成的类中对关键字 CHAR(16) -> BINARY(16) 运行搜索和替换,这不是“时尚”。

【问题讨论】:

    标签: firebird jooq jaybird


    【解决方案1】:

    octetsAsBytes 设置在 Jaybird 3 中没有任何作用,请参阅 Jaybird 3 发行说明中的​​ Character set OCTETS handled as JDBC (VAR)BINARY。 Jaybird 3 在以前的版本中始终表现为octetsAsBytes=true,并进行了一些进一步的改进。

    换句话说,这根本与那个设置无关,而是 jOOQ 生成它的结果。

    jOOQ 通过直接查询 Firebird 元数据表并将 Firebird 类型代码映射到 jOOQ SQL 类型(参见 FirebirdTableDefinitionFirebirdDatabase.FIELD_TYPE)来进行自己的元数据自省。它直接将 Firebird 类型“15”映射到 CHAR,而无需进一步考虑子类型(== 此类型的字符集)。

    换句话说,如果您想将其映射到 BINARY,则需要向 jOOQ 提交改进票(尽管我不清楚为什么这对您来说确实是个问题)。

    【讨论】:

    • 感谢您的快速答复。我知道actetsAsBytes 是为最新版本的Jaybird2 提供的,只是你知道....它可能会工作...... :) 我想你对jOOQ 代码生成逻辑是正确的。无论如何,我将此答案标记为足够正确:)
    猜你喜欢
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2015-11-29
    相关资源
    最近更新 更多