JOOQ生成CHAR OCTETS列作为CHAR而不是BINARY

时间:2018-12-06 08:44:10

标签: firebird jooq jaybird

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

中提到的问题

设置: Jaybird 3.0.5,Firebird 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>
    <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

我尝试将其放置在<jdbc>中的属性中,例如

<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)运行搜索和替换,这不是“时尚”。

1 个答案:

答案 0 :(得分: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提交改进单(尽管我不清楚为什么这对您来说确实是一个问题)。