JOOQ sum字段值:BigDecimal到Int

时间:2017-09-11 18:41:31

标签: postgresql kotlin jooq

我使用的postgres的值字段为numeric。 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)

我可以通过Int获得.toString().toInt()总和。但我想知道是否有更好的方式将BigDecimal转为Int

PS

我想这更像是一个kotlin问题,而不是JOOQ问题。

2 个答案:

答案 0 :(得分:0)

是的,有。只需重复使用之前的列引用:

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;

答案 1 :(得分:0)

您可以在源集中创建包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