Java jOOQ select into POJO,仅为某些字段指定映射

Java jOOQ select into POJO,仅为某些字段指定映射,java,sql,enums,jooq,Java,Sql,Enums,Jooq,我将jOOQ与普通SQL(不是生成的代码)一起使用。 我试图直接选择一个POJO,它有一些enum类型的字段 MyType pojo = context.select().from(table("Table")) .where(field("ID").equal("1")).fetchOne() .into(MyType.class); 在我看来,我只能为我的整个POJO指定一个高级映射器,如下所示: MyType pojo = context.

我将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) {
                    ...
                }
            });
MyType pojo=context.select().from(表(“表”))
.where(field(“ID”).equal(“1”).fetchOne()
.map(新记录映射器(){
@凌驾
公共MyType映射(记录){
...
}
});
我找不到只为某些字段提供映射或转换器的方法。具体地说,我想告诉jooq类似于“正常转换所有字段,除非我的POJO中的字段是MyEnum类型,在这种情况下使用此映射(或转换器)”

如何为某些字段而不是其他字段指定映射器


顺便说一句,我注意到我可以在配置级别执行类似的操作,将数据库字段名与通配符(如上所述)匹配,但我认为最好由POJO中字段的类型来决定。有不同的方法来解决此问题:

1.使用代码生成器 很明显。我知道你没有使用它,但也许有人会发现这个问题。在这种情况下,代码生成器将:

  • 自动为您生成枚举类型(如果您使用的是MySQL或PostgreSQL枚举)
  • 允许您使用
    ,您可以在其中实现自己的和/或
  • 2.将显式转换器/绑定也用于普通SQL 即使不使用代码生成器,您也可以通过指定自己的以下内容从自定义转换器/绑定中获益:

    //假设枚举类型枚举varchar值:
    SQLDataType myEnumType=
    asConvertedDataType(新的MyEnumConverter());
    
    现在,您可以使用

    context.select(字段(“列”,myEnumType),…)
    .从(表(“表”))
    
    在这种情况下,不再需要在记录映射器中进行显式转换,因为jOOQ
    record
    已经包含所需的数据类型

    3.使用自定义的
    RecordMapperProvider
    如果您使用的是任何一种方法,默认情况下,将使用。它知道如何通过调用
    EnumClass.valueOf(stringValue)
    将字符串转换为枚举。如果这不是您想要的行为(如您的问题所示),那么您仍然可以通过提供自己的行为来覆盖默认行为

    这也是您所称的“高级映射器”,但您可以全局注册它,并在任何时候将其映射到
    MyType.class
    时重用它

    (4.使用转换器注册表)
    jOOQ的未来版本(还不是jOOQ 3.9)可能支持转换器注册表,该注册表允许为任何类型对实现默认转换
    。这就是问题所在。

    谢谢!解决方案3,即调用默认的
    EnumClass.valueOf(stringValue)
    似乎是最好的方法。我将更改代码以允许valueOf()工作。