具有自定义类型的 Kotlin 中的 JOOQ SUM

JOOQ SUM in Kotlin with custom types

目前我有一个转换器可以在 JOOQ 中使用 Kotlin 处理值对象。

我的数据库有一个名为 transactions 的 table 和一个名为 billing _amount 的字段类型 decimal(10, 2) 并且在我的 Kotlin 代码中我有一个来自 DDD 的简单 ValueObject 来包装它up,调用BillingAmount定义如下

data class BillingAmount(val value: BigDecimal)

至于我的 jooq 自定义转换器,我有以下代码:

public final TableField<TransactionsRecord, BillingAmount> BILLING_AMOUNT =
        createField(
                DSL.name("billing_amount"),
                org.jooq.impl.SQLDataType.NUMERIC(10, 2).nullable(false),
                this,
                "",
                org.jooq.Converter.ofNullable(
                    java.math.BigDecimal.class,
                    okano.dev.jooqtesting.BillingAmount.class,
                    t -> new okano.dev.jooqtesting.BillingAmount(t),
                    u -> u.getValue()
                )
        );

在我的存储库中,我只是想检索账单金额的总和,但 jooq 抱怨 BillingAmount 没有扩展 Number class。我知道这是阻止我的代码工作的 Java 通用验证,但是除了扩展 Number class 之外,还有什么办法可以解决这个问题?我认为转换器应该足够了,但我肯定错了。

这是我要实现的简单查询:

// jooq is an instance of DSLContext
return jooq.select(sum(TABLE.BILLING_AMOUNT))
            .from(TABLE)
            .fetchSingle()

对这个问题有什么想法吗?提前致谢。

作为解决方法,您始终可以在 jOOQ

中使用 plain SQL templating
fun alternativeSum(field: Field<*>) = DSL.field("{0}", field.getDataType(), field)

我认为您遇到的问题只是由于 Java 的类型系统造成的。

如果是这样,您可以简单地 coerce 将字段 coerce 为查询的不同类型,就像这样(诚然,混淆了查询定义代码):

BillingAmount sum = jooq
  .select(sum(TABLE.BILLING_AMOUNT.coerce(BigDecimal.class)))
  .from(TABLE)
  .fetchSingle(TABLE.BILLING_AMOUNT);

虽然它与原始查询中的结果类型不完全相同,因为它直接实现了 BillingAmount,而不是 Record<BillingAmount>(因为在强制转换后查询 return 类型将是 Record<BigDecimal>.