具有自定义类型的 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>
.
目前我有一个转换器可以在 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 templatingfun 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>
.