在我的应用程序中,使用java.util.UUID
标识了一段内容。在数据库中存储信息时,我使用的相应MySQL数据类型为BINARY(16)
。 BINARY
的默认JDBC数据类型为byte[]
。所以我有一个自定义org.jooq.Converter
来在UUID和byte []之间进行转换。
我有一个用例,我需要将表中的记录复制到同一个表中,但只复制某些列,而不是全部。在我发布here的原始问题中,以下是解决方案
public void copy(UUID source, UUID target) {
jooq.insertInto(PERSON)
.columns(PERSON.ID, PERSON.FNAME, PERSON.LNAME)
.select(select(val(target), PERSON.FNAME, PERSON.LNAME)
.from(PERSON)
.where(PERSON.ID.eq(source)))
.execute();
}
但执行这段代码会导致异常
Data truncation: Data too long for column 'id' at row 1
我发现DSL.val()
没有使用我用来将UUID转换为byte []的自定义转换器。如何强制DSL.val()函数使用自定义转换器?
答案 0 :(得分:1)
解决方案:使用DSL.val(java.lang.Object value, DataType<T> type)
代替DSL.val(java.lang.Object value)
以下是更新的代码段
public void copy(UUID source, UUID target) {
DataType<UUID> uuidType = SQLDataType.BINARY
.asConvertedDataType(new UuidBinaryConverter());
jooq.insertInto(PERSON)
.columns(PERSON.ID, PERSON.FNAME, PERSON.LNAME)
.select(select(val(target, uuidType), PERSON.FNAME, PERSON.LNAME)
.from(PERSON)
.where(PERSON.ID.eq(source)))
.execute();
}