【问题标题】:JOOQ Forced types to convert a BigInteger to BigDecimal for POSTGRESJOOQ 强制类型将 BigInteger 转换为 BigDecimal 以用于 POSTGRES
【发布时间】:2021-12-16 16:35:45
【问题描述】:

对于一个表,假设是 myTable,我有一个列 myColumn..

默认的 JOOQ 生成将 myColumn 创建为 BigInteger,

我想将它创建为 BigDecimal。

这是我正在使用的转换器。

public class myConverter extends AbstractConverter<BigInteger, BigDecimal> {

    public BigIntToBigDecConverter(Class<BigInteger> fromType, Class<BigDecimal> toType) {

        super(fromType, toType);
    }

    @Override
    public BigDecimal from(BigInteger databaseObject) {
        return new BigDecimal(databaseObject);
    }

    @Override
    public BigInteger to(BigDecimal userObject) {
        return new BigInteger(String.valueOf(userObject.intValue()));
    }
}

forceType 配置在 XML 文件中应该是怎样的?

【问题讨论】:

  • 你尝试过什么from here?为什么它不起作用?
  • @LukasEder 我试过这个``` java.math.BigDecimalxyz.myclass.BigIntToBigDecConverter BigInteger\.** ```日志没有显示任何具体错误。
  • 您可以编辑您的问题,添加更多详细信息...

标签: java sql jooq


【解决方案1】:

您的列生成为BigInteger 的原因是因为它们的类型为NUMERIC(n, 0)、NUMBER(n, 0) 或DECIMAL(n, 0),具体取决于您使用的方言,但这里的关键是比例是0,而n 足够大以至于它不再适合Long。

您的&lt;forcedType/&gt; 配置不起作用的原因是您在&lt;types/&gt; 中列出的类型是Java 类型BigInteger,而不是SQLDataType、see documentation here。为了重写所有零刻度小数以产生BigDecimal,只需这样写:

<forcedType>
  <name>NUMERIC</name>
  <inputTypes>(?i:(NUMERIC|NUMBER|DECIMAL)\(\d+,0\))</inputTypes>
</forcedType>

您不需要定制转换器

【讨论】:

  • 如果我想对特定表的单个列执行此操作怎么办
  • 然后只需将常用的&lt;includeExpression&gt; 正则表达式添加到&lt;forcedType&gt;
猜你喜欢
  • 2013-08-26
  • 2012-05-30
  • 2018-11-30
  • 2021-11-15
  • 1970-01-01
  • 2014-02-04
  • 2015-01-18
  • 1970-01-01
  • 2015-12-17
相关资源
最近更新 更多