【问题标题】:Converting jOOQ record to POJO using converter使用转换器将 jOOQ 记录转换为 POJO
【发布时间】:2019-03-31 00:07:11
【问题描述】:

在我的 Oracle 数据库中,我有存储为 VARCHAR 的金额值。从数据库中检索记录时,我希望将它们映射到 POJO,其中金额值表示为 double。不幸的是,我不能使用强制类型,因为数据库中的所有内容都存储为 VARCHAR,并且没有将列标识为包含金额值的模式。

我正在查看jOOQ converters,这似乎是我想要的。因此,我为此目的创建了一个 jOOQ 转换器:

public class DoubleConverter implements Converter<String, Double> {

    @Override
    public Double from(String stringValue) {
        return new Double(stringValue);
    }

    @Override
    public String to(Double doubleValue) {
        DecimalFormat df = new DecimalFormat();
        df.setMinimumFractionDigits(0);
        df.setGroupingUsed(false);

        return df.format(doubleValue);
    }

    @Override
    public Class<String> fromType() {
        return String.class;
    }

    @Override
    public Class<Double> toType() {
        return Double.class;
    }

}

但是,每当我想使用record.into(MyClass.class) 将数据库记录映射到我的 POJO 时,我想触发此转换器,然后在我回写数据库时触发。请问您建议如何实现这一目标?

【问题讨论】:

  • “很遗憾,我不能使用强制类型,因为数据库中的所有内容都存储为 VARCHAR。” - 这并不能真正解释为什么不能使用强制类型。强制类型代码生成配置正是为您所考虑的目的而设计的。您介意解释一下您在这方面遇到的困难吗?
  • 嗨,卢卡斯。我的意思是每个值(无论是数字还是文本)都作为 VARCHAR 存储在我正在使用的数据库中。因此,我不能使用强制类型,因为我不能将所有 VARCHAR 列转换为双精度,也不能使用表达式,因为没有关于哪些列是数字的模式。因此,这就是为什么我希望按照问题中的说明实现这一目标。
  • 好吧,除非你告诉它,否则 jOOQ 怎么知道何时应用你的转换器? :)

标签: java pojo jooq


【解决方案1】:

虽然我强烈建议您以某种方式获取所有双列的列表并在代码生成配置中应用强制类型配置,但在您的特定情况下,您不必做太多事情就可以调用 @987654324 @。

您的record 将仅包含String 值,而您的MyClass 类将包含匹配的double 属性。 jOOQ 会自动从String 转换为double,反之亦然。默认情况下,将应用DefaultRecordMapperDefaultRecordUnmapper

您可以通过指定新的 RecordMapperProviderRecordUnmapperProvider 来覆盖它们,如下所述: https://www.jooq.org/doc/latest/manual/sql-execution/fetching/pojos-with-recordmapper-provider

要正确地做到这一点需要一些工作。

【讨论】:

    猜你喜欢
    • 2021-02-24
    • 2014-11-17
    • 2012-12-31
    • 1970-01-01
    • 2020-02-20
    • 2020-02-23
    • 1970-01-01
    • 2019-07-06
    • 2013-11-11
    相关资源
    最近更新 更多