JOOQ генерирует столбцы CHAR OCTETS как CHAR вместо BINARY - PullRequest
0 голосов
/ 06 декабря 2018

Моя проблема очень близка к проблеме, упомянутой в Использование UUID PK или FK в Firebird с Jooq

Настройка: Jaybird 3.0.5, Firebird 2.5.7, jOOQ 3.11.7, JDK1.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 голосов
/ 06 декабря 2018

Настройка octetsAsBytes ничего не делает в Jaybird 3, см. Набор символов OCTETS, обработанный как JDBC (VAR) BINARY в примечаниях к выпуску Jaybird 3.Jaybird 3 всегда ведет себя как octetsAsBytes=true в предыдущих версиях с некоторыми дополнительными улучшениями.

Другими словами, это вообще не связано с этим параметром, а вместо этого является результатом того, как jOOQ генерирует это.

jOOQ выполняет собственный анализ метаданных, напрямую запрашивая таблицы метаданных Firebirdи сопоставление кодов типов Firebird с типами jOOQ SQL (см. FirebirdTableDefinition и FirebirdDatabase.FIELD_TYPE ).Он напрямую отображает тип Firebird '15' на CHAR, без дальнейшего рассмотрения подтипов (== наборов символов для этого типа).

Другими словами, вам нужно подать заявку на улучшение с помощью jOOQ, если вывместо этого хочу сопоставить это с BINARY (хотя мне непонятно, почему это действительно проблема для вас).

...