我使用的是jOOQ和普通SQL (不是生成的代码)。我试图直接选择一个POJO,其中包含一些类型为enum的字段。
MyType pojo = context.select().from(table("Table"))
.where(field("ID").equal("1")).fetchOne()
.into(MyType.class);
在我看来,我只能为整个POJO指定一个高级映射器,如下所示:
MyType pojo = context.select().from(table("Table"))
.where(field("ID").equal("1")).fetchOne()
.map(new RecordMapper<Record, MyType>() {
@Override
public MyType map(Record record) {
...
}
});
我无法找到只为某些字段提供映射或转换器的方法。具体来说,我想告诉jooq“正常地转换所有字段,除非我的POJO中的字段是MyEnum类型,在这种情况下使用此映射(或转换器)”。
如何为某些字段而不是其他字段指定映射程序?
顺便说一句,我注意到我可以在配置级别执行类似的操作,将数据库字段名与通配符(如描述的这里)匹配,但我认为最好由POJO中的字段类型来决定。
发布于 2017-01-12 20:05:18
解决这一问题有各种不同的方法:
1.使用代码生成器
很明显。我知道你没有用,但也许会有人发现这个问题。在这种情况下,代码生成器将:
2.使用显式转换器/绑定(也可以使用普通SQL )。
即使不使用代码生成器,也可以通过指定自己的DataType
从自定义转换器/绑定中获益。
// Assuming that the enum type enumerates varchar values:
SQLDataType<MyEnum> myEnumType =
SQLDataType.VARCHAR.asConvertedDataType(new MyEnumConverter());
现在,您可以在普通SQL Field
表达式中使用该类型,使用DSL.field(String, DataType)
。
context.select(field("Column", myEnumType), ...)
.from(table("Table"))
在这种情况下,记录映射程序中不再需要显式转换,因为jOOQ Record
已经包含所需的数据类型。
3.使用自定义RecordMapperProvider
如果您使用的是任何into(Class)
方法,默认情况下,将使用DefaultRecordMapper
。它知道如何通过调用EnumClass.valueOf(stringValue)
将字符串转换为枚举。如果这不是您想要的行为(正如您的问题所建议的那样),那么您仍然可以通过提供您自己的RecordMapperProvider
来覆盖默认行为。
这也是您所称的“高级映射器”,但您可以在全局注册它,并在您想映射到MyType.class
时随时重用它。
(4.使用转换器注册表)
未来版本的jOOQ (还不是jOOQ 3.9 )可能支持转换器注册中心,该注册表允许为任何类型的<T, U>
实现默认转换。这是问题#5713。
https://stackoverflow.com/questions/41600104
复制相似问题