JOOQ 强制类型将 BigInteger 转换为 BigDecimal 以用于 POSTGRES

Posted

技术标签:

【中文标题】JOOQ 强制类型将 BigInteger 转换为 BigDecimal 以用于 POSTGRES【英文标题】:JOOQ Forced types to convert a BigInteger to BigDecimal for 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\.** ```日志没有显示任何具体错误。 您可以编辑您的问题,添加更多详细信息... 【参考方案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;

以上是关于JOOQ 强制类型将 BigInteger 转换为 BigDecimal 以用于 POSTGRES的主要内容,如果未能解决你的问题,请参考以下文章

java中BigDecimal和bigInteger如何转换

PostgreSQL 函数 + 在 jOOQ 中强制转换

使用 MSSQL 数据库类型别名,jooq 3.7.3 将它们转换为正确的 Java 类型,但 3.12.3 将它们全部转换为 Java 类型 Object

请问,java里,如何把BigDecimal类型转成Integer

Jooq 强制类型未应用于列

如何在 jooq 中将数据转换为 Result<Record> 数据类型