JOOQ 将 CHAR OCTETS 列生成为 CHAR 而不是 BINARY
JOOQ generates CHAR OCTETS columns as CHAR instead of BINARY
我的问题与 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
我想在生成的 classes
中使用 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
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>
同样的结果。
怎么了?
我目前正在考虑 运行 在生成的 class 中搜索并替换关键字 CHAR(16)
-> BINARY(16)
,这不是 'stylish'.
设置 octetsAsBytes
在 Jaybird 3 中没有任何作用,请参阅 Jaybird 3 发行说明中的 Character set OCTETS handled as JDBC (VAR)BINARY。 Jaybird 3 的行为与以前版本中的 octetsAsBytes=true
一样,但有一些进一步的改进。
换句话说,这与那个设置根本无关,而是 jOOQ 生成它的结果。
jOOQ 通过直接查询 Firebird 元数据表并将 Firebird 类型代码映射到 jOOQ SQL 类型(参见 FirebirdTableDefinition and FirebirdDatabase.FIELD_TYPE)来进行自己的元数据内省。它直接将 Firebird 类型 '15' 映射到 CHAR
,而不进一步考虑子类型(== 这种类型的字符集)。
换句话说,如果您想将其映射到 BINARY
,则需要向 jOOQ 提交改进单(尽管我不清楚为什么这对您来说确实是个问题)。
我的问题与 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
我想在生成的 classes
中使用 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
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>
同样的结果。
怎么了?
我目前正在考虑 运行 在生成的 class 中搜索并替换关键字 CHAR(16)
-> BINARY(16)
,这不是 'stylish'.
设置 octetsAsBytes
在 Jaybird 3 中没有任何作用,请参阅 Jaybird 3 发行说明中的 Character set OCTETS handled as JDBC (VAR)BINARY。 Jaybird 3 的行为与以前版本中的 octetsAsBytes=true
一样,但有一些进一步的改进。
换句话说,这与那个设置根本无关,而是 jOOQ 生成它的结果。
jOOQ 通过直接查询 Firebird 元数据表并将 Firebird 类型代码映射到 jOOQ SQL 类型(参见 FirebirdTableDefinition and FirebirdDatabase.FIELD_TYPE)来进行自己的元数据内省。它直接将 Firebird 类型 '15' 映射到 CHAR
,而不进一步考虑子类型(== 这种类型的字符集)。
换句话说,如果您想将其映射到 BINARY
,则需要向 jOOQ 提交改进单(尽管我不清楚为什么这对您来说确实是个问题)。