繁体   English   中英

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

[英]jOOQ select into POJO with mappings specified only for some fields

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

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中的字段的类型来驱动。

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

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());

现在,您可以使用DSL.field(String, DataType)在纯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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM