在我的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时都触发该转换器,然后每当我写回数据库时都触发该转换器。您如何建议实现这一目标?
答案 0 :(得分:1)
虽然我强烈建议您以某种方式获取所有双列的列表,并在代码生成配置中应用强制类型配置,但在您的特殊情况下,您不必做很多事情就可以调用{{ 1}}。
您的record.into(MyClass.class)
仅包含record
值,而您的String
类将包含匹配的MyClass
属性。 jOOQ将自动从double
转换为String
,反之亦然。默认情况下,将应用DefaultRecordMapper
和DefaultRecordUnmapper
。
您可以通过指定一个新的double
和一个RecordMapperProvider
来覆盖它们,如此处所述:
https://www.jooq.org/doc/latest/manual/sql-execution/fetching/pojos-with-recordmapper-provider
正确执行此操作会有点麻烦。