首页 > 解决方案 > 为 JOOQ 的 DSL.val() 使用自定义转换器

问题描述

在我的应用程序中,使用java.util.UUID. 在数据库中存储信息时,我使用的相应 MySQL 数据类型是BINARY(16). 的默认 JDBC 数据类型BINARYbyte[]. 所以我有一个org.jooq.Converter在 UUID 和 byte[] 之间转换的习惯。

我有一个用例,我需要将表中的记录复制到同一个表中,但只复制某些列而不是全部。在我在这里发布的原始问题中,以下是解决方案

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 转换为字节 [] 的自定义转换器。如何强制 DSL.val() 函数使用自定义转换器?

标签: javamysqlsqljooq

解决方案


解决方案:使用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();
} 

推荐阅读