java - Kotlin 中的 JOOQ SUM 与自定义类型

标签 java sql kotlin aggregation jooq

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

我的数据库有一个名为 transactions 的表,其字段类型 decimal(10, 2) 名为 billing _amount ,在我的 Kotlin 代码上我有一个来自 DDD 的简单 ValueObject 来包装它,称为 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 类。我知道这是一个 Java 通用验证,它会阻止我的代码工作,但是除了扩展 Number 类之外,还有什么办法可以解决这个问题吗?我认为转换器应该足够了,但我肯定错了。

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

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

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

最佳答案

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

如果是这样,您可以简单地 coerce将字段设置为查询的不同类型,如下所示(不可否认,这使查询定义代码变得困惑):

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

不过,它与原始查询中的结果类型并不完全相同,因为它具体化了 BillingAmount直接,而不是 Record<BillingAmount> (因为强制后查询返回类型将是 Record<BigDecimal>

关于java - Kotlin 中的 JOOQ SUM 与自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61772240/

相关文章:

java - 如何使用两个 jar 配置 JVM Argument -javaagent

java - 打印排序字符串时去除重复项

sql - 如何在同一批处理语句中更新新添加的列

java - Android Studio 不断导入 import sun.jvm.hotspot.utilities.IntArray

javax jws deploy 无法获取端点

java - 在 Java 中按值对映射进行排序

php - Laravel:删除数据的 Controller 功能

mysql - MySQL 中从关系表中获取所有关联值同时过滤相同值的最有效方法

android - 有什么方法可以在 Kotlin 中扩展类时覆盖 setter 属性

android - Kotlin 调用 Java 平台类型导致 illegalStateException