JOOQ总和字段值:bigdecimal to int



我正在使用带有 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是具有idsum字段的数据类:

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

最新更新