我在 Firebird 中有一个带有 PK 列的表
CREATE TABLE TEST
(
ID CHAR(16) CHARACTER SET OCTETS NOT NULL,
CONSTRAINT PK_TEST PRIMARY KEY (ID)
);
OCTETS 编码被视为字节。
我创建了一个转换器
public class UUIDConverter implements Converter<byte[], UUID>{
@Override
public Class<byte[]> fromType() {
return byte[].class;
}
@Override
public Class<UUID> toType() {
return UUID.class;
}
@Override
public UUID from(byte[] bytes) {
if (bytes == null) return null;
ByteBuffer bb = ByteBuffer.wrap(bytes);
long high = bb.getLong();
long low = bb.getLong();
return new UUID(high, low);
}
@Override
public byte[] to(UUID uuid) {
if (uuid == null) return null;
byte[] buffer = new byte[16];
ByteBuffer bb = ByteBuffer.wrap(buffer);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return buffer;
}
}
然后我在我的 pom 中配置了转换器(我使用 maven 生成源)
<customTypes>
<customType>
<name>UUID</name>
<converter>com.vas.database.UUIDConverter</converter>
</customType>
</customTypes>
<forcedTypes>
<forcedType>
<name>VARBINARY</name>
<expressions>ID|ID_.*</expressions>
</forcedType>
</forcedTypes>
虽然生成了代码,但并不是我所期望的。
public final TableField<TestRecord, byte[]> ID = createField("ID", org.jooq.impl.SQLDataType.VARBINARY.nullable(false), this, "");
这就是我希望生成的内容(我手动进行了更改,一切都很好)。
public final TableField<TestRecord, UUID> ID = createField("ID", org.jooq.impl.SQLDataType.VARBINARY.nullable(false), this, "", new UUIDConverter());
我如何使它工作?(顺便说一下,我使用的是 Firebird 3.0、Jooq 3.10.1 和 Jaybird 2.2.13)