Java 在jOOQ中注册全局转换器

Java 在jOOQ中注册全局转换器,java,sql,jooq,Java,Sql,Jooq,我有一段代码,如: ctx.select() .from() ... .fetchInto(MyAwesomeClass.class) MyAwesomeClass有一个自定义类型的字段(我们称之为MyLong),可以将其转换为/fromLong。目前,jOOQ无法在Long和MyLong之间转换: org.jooq.exception.DataTypeException:无法从1(类java.lang.Long)转换为类foo.bar.MyLong 我想在jOOQ DSL配置中注册一个转换

我有一段代码,如:

ctx.select()
.from()
...
.fetchInto(MyAwesomeClass.class)
MyAwesomeClass
有一个自定义类型的字段(我们称之为
MyLong
),可以将其转换为/from
Long
。目前,jOOQ无法在
Long
MyLong
之间转换:

org.jooq.exception.DataTypeException:无法从1(类java.lang.Long)转换为类foo.bar.MyLong
我想在jOOQ DSL配置中注册一个转换器,以将
Long
转换为
MyLong
。我有转换器,但我正在努力使它进入DSL配置。有一个选项可以为配置提供一个ConverterProvider,我这样做了,但它似乎不起作用

ConverterProvider代码段如下所示:

DataType<MyLong> MY_LONG_TYPE = SQLDataType.BIGINT.asConvertedDataType(new MyLongConverter());
Field<MyLong> MY_LONG_FIELD = field(name("MY_TABLE", "MY_LONG_FIELD"), MY_LONG_TYPE);
newdefaultconfiguration()
.设置(
新转换器提供程序(){
@凌驾
提供公共转换器(tType类、uType类){
if(tType==Long.class&&uType==MyLong.class){
返回(Converter)Converter.of(Long.class,MyLong.class,MyLong::of,MyLong::toLong);
}否则{
抛出新的UnsupportedOperationException();
}
}
});
我知道这个API被标记为实验性的,但是有没有其他方法来实现我想要的,而不在代码生成端声明强制绑定或其他构造?

ConverterProviderSPI SPI已添加到jOOQ 3.6中,但该添加未被记录,也未完全实施SPI。被拒绝的相关问题是:

由于
Configuration
API中存在向后兼容性问题,SPI类型尚未删除(在使用Spring配置时尤其相关)

截至jOOQ 3.11的当前解决方案 这个SPI确实可以解决你的问题。在实现类似的SPI之前,您需要使用属于投影/
SELECT
子句的字段注册自定义的
转换器
类型。这可以通过两种方式实现:

  • 使用代码生成器

    您可以使用代码生成器中的轻松注册自己的自定义数据类型和相关转换器。这样,无论何时选择转换的列,jOOQ都将生成您自己的自定义类型
    MyLong
    ,而不是数据库/JDBC类型
    Long

  • 使用特殊转换类型

    如果不使用代码生成器,可以创建自己的数据类型,如下所示:

    DataType<MyLong> MY_LONG_TYPE = SQLDataType.BIGINT.asConvertedDataType(new MyLongConverter());
    Field<MyLong> MY_LONG_FIELD = field(name("MY_TABLE", "MY_LONG_FIELD"), MY_LONG_TYPE);
    

这将如何适用于插入/更新声明?我假设在获取期间,转换器将使用from(..)方法,如果使用转换器,则在insert/update语句期间使用to(..)方法。我的假设正确吗?@user1135357:你介意问一个新问题,再补充一些细节吗?很抱歉。以上面的示例为例,如果我想在MY_表中插入/更新记录,将如何触发MyLongConverter以将MyLong值转换为长值(数据库可以理解)?MyLongConverter.to(..)方法会以某种方式被触发吗?@user1135357:是的,它会被“触发”。不过,如果你问一个有上下文的新问题,事情会简单得多。别担心。堆栈溢出不会很快耗尽毫无疑问的ID。