为JOOQ的DSL.val()使用自定义转换器

时间:2018-06-07 12:59:55

标签: java mysql sql jooq

在我的应用程序中,使用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()函数使用自定义转换器?

1 个答案:

答案 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();
}