我正在使用带有 numeric
的值字段的postgres。JOOQ将其变成BigDecimal
。我的jooq查询是:
val sumField = DSL.sum(TABLE.VALUE)
val query = dsl().select(TABLE.id.`as`("id"), sumField.`as`("sum"))
.from(TABLE)
.groupBy(TABLE.id)
.fetch()
.map{
record -> SumById(
id = record.get("id").toString(),
sum = record.get("sum").toString().toInt()
)
}
其中SumById
是具有id
和sum
字段的数据类:
data class SumById (val id: String, val sum: Int)
我可以通过执行.toString().toInt()
获得Int
总和。但是我想知道是否有更好的方法将BigDecimal
转到Int
。
ps
我猜这比jooq问题更像是一个科特林问题。
是的,有。只需重复前面的列推荐:
record -> SumById(
id = record.get(TABLE.id.`as`("id")),
sum = record.get(sumField.`as`("sum"))
)
另外,您也可以将它们存储在本地变量中。另一个选项是使用Record2.value1()
和Record2.value2()
record -> SumById(
id = record.value1(),
sum = record.value2()
)
...由于类型信息由JOOQ API在您的查询中维护(至少超过22度)。
在JOOQ 3.10中,您也可以使用新的Kotlin破坏支持,其中Record2<String, BigDecimal>
可以破坏如下:
val (id, sum) = record;
您可以在源集中创建软件包org.jooq.impl
,并使用整数类型制作自己的功能sum
:
package org.jooq.impl
import org.jooq.AggregateFunction
import org.jooq.Field
public class DSLX {
public AggregateFunction<Integer> sum(Field<Integer> field) {
return new Function("sum", SQLDataType.INTEGER, field);
}
}
因为Function
类具有软件包 - 捕集构造器。现在,您无需转换BigDecimal