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
),可以将其转换为/fromLong
。目前,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都将生成您自己的自定义类型
,而不是数据库/JDBC类型MyLong
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);