目前我有一个转换器可以使用 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/