【问题标题】:jOOQ select into POJO with mappings specified only for some fieldsjOOQ 选择到 POJO,仅针对某些字段指定映射
【发布时间】:2017-05-26 18:55:38
【问题描述】:

我正在使用带有纯 SQL 的 jOOQ(不是生成的代码)。 我正在尝试直接选择具有一些枚举类型字段的 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 类型,在这种情况下使用此映射(或转换器)”。

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

顺便说一句,我注意到我可以在配置级别执行类似的操作,将数据库字段名称与通配符匹配(如 here 所述),但我认为如果决定由字段类型驱动会更好在 POJO 中。

【问题讨论】:

    标签: java sql enums jooq


    【解决方案1】:

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

    1。使用代码生成器

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

    1. 自动为您生成枚举类型(如果您使用的是 MySQL 或 PostgreSQL 枚举)
    2. 允许您使用&lt;forcedTypes/&gt;,您可以在其中实现自己的converters 和/或bindings

    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)可能支持转换器注册表,该注册表允许为任何一对类型 &lt;T, U&gt; 实现默认转换。这是问题#5713

    【讨论】:

    • 谢谢!解决方案 3,即调用默认的 EnumClass.valueOf(stringValue) 似乎是最好的方法。我将更改我的代码以允许 valueOf() 工作。
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 2017-08-03
    • 2017-08-04
    • 2014-08-02
    • 2020-12-26
    • 2020-10-28
    • 2019-09-19
    • 2018-05-03
    相关资源
    最近更新 更多