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



我的问题与使用Jooq 在Firebird中使用UUID PK或FK中提到的问题非常接近

设置: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>

我在生成器中设置了forceType,如

<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),这不是"时尚的"。

设置octetsAsBytes在Jaybird 3中不起任何作用,请参阅Jaybird发布说明中作为JDBC(VAR(BINARY处理的字符集OCETS。Jaybird 3在以前的版本中一直表现为octetsAsBytes=true,并进行了一些进一步的改进。

换句话说,这根本与该设置无关,而是jOOQ如何生成该设置的结果。

jOOQ通过直接查询Firebird元数据表并将Firebird类型代码映射到jOOQ SQL类型(请参见FirebirdTableDefinition和FirebirdBatabase.FIELD_type(来进行自己的元数据内省。它直接将FirebirdType'15'映射到CHAR,而不进一步考虑子类型(==此类型的字符集(。

换句话说,如果你想将其映射到BINARY,你需要向jOOQ提交一份改进单(尽管我不清楚为什么这对你来说真的是个问题(。

相关内容

  • 没有找到相关文章

最新更新