jOOQ 选择 POJO,仅为某些字段指定映射

Rob*_*kes 5 java sql enums jooq

我使用 jOOQ 和普通 SQL(不是生成的代码)。我正在尝试直接选择具有一些枚举类型字段的 POJO。

MyType pojo = context.select().from(table("Table"))
            .where(field("ID").equal("1")).fetchOne()
            .into(MyType.class);
Run Code Online (Sandbox Code Playgroud)

在我看来,我只能为整个 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) {
                    ...
                }
            });
Run Code Online (Sandbox Code Playgroud)

我找不到只为某些字段提供映射或转换器的方法。具体来说,我想告诉 jooq 类似“正常转换所有字段,除非我的 POJO 中的字段是 MyEnum 类型,在这种情况下使用此映射(或转换器)”。

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

顺便说一句,我注意到我可以在配置级别做类似的事情,将数据库字段名称与通配符匹配(如此处所述,但我认为如果由 POJO 中字段的类型来驱动决策会更好。

Luk*_*der 4

有不同的方法可以解决这个问题:

1.使用代码生成器

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

  1. 自动为您生成枚举类型(如果您使用 MySQL 或 PostgreSQL 枚举)
  2. 允许您使用<forcedTypes/>,您可以在其中实现您自己的转换器和/或绑定

2. 对纯 SQL 也使用显式转换器/绑定

即使您不使用代码生成器,您也可以通过指定您自己的自定义转换器/绑定来受益DataType

// Assuming that the enum type enumerates varchar values:
SQLDataType<MyEnum> myEnumType = 
    SQLDataType.VARCHAR.asConvertedDataType(new MyEnumConverter());
Run Code Online (Sandbox Code Playgroud)

现在,您可以在纯 SQLField表达式中使用该类型,使用DSL.field(String, DataType)

context.select(field("Column", myEnumType), ...)
       .from(table("Table"))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,记录映射器中不再需要显式转换,因为 jOOQRecord已经包含所需的数据类型。

3. 使用自定义RecordMapperProvider

如果您使用其中任何一种into(Class)方法,则默认情况下DefaultRecordMapper将使用 。它知道如何通过调用将字符串转换为枚举EnumClass.valueOf(stringValue)。如果这不是所需的行为(如您的问题所示),那么您仍然可以通过提供您自己的RecordMapperProvider.

正如您所说,这也是一个“高级映射器”,但您可以全局注册它并在您想要映射到MyType.class.

(4.使用转换器注册表)

jOOQ 的未来版本(还不是 jOOQ 3.9)可能支持转换器注册表,允许为任何类型对实现默认转换<T, U>。这是问题#5713