为什么Anorm的executeInsert会抱怨从BigDecimal转换?

时间:2012-12-20 17:47:40

标签: playframework-2.0 derby anorm

我在Play 2.0.2中使用带有Anorm的Derby数据库。即使没有列有BigDecimal字段,插入表时也会出现以下错误。

  

执行异常[[RuntimeException:TypeDoesNotMatch(无法将1:类java.math.BigDecimal转换为Long为列.1)]]

如果我查看表格,我可以看到我的数据已经输入,所以我推断问题与返回新密钥有关。但我清楚地将密钥声明为bigint - 为什么抱怨BigDecimal

1 个答案:

答案 0 :(得分:4)

事实证明,Derby always returns the key as a BigDecimal - 即使它们是键也是另外定义的。解决方案是使用自定义ResultSetParser来处理BigDecimal。返回的id列名为“1”。

  def idResultSetParser(implicit extractor: anorm.Column[java.math.BigDecimal]) =
    ResultSetParser.singleOpt[java.math.BigDecimal](
      anorm.SqlParser.get[java.math.BigDecimal]("1"))

或者,把它们放在一起。

  import java.math.BigDecimal
  s.executeInsert[Option[BigDecimal]](
      ResultSetParser.singleOpt[BigDecimal](
          anorm.SqlParser.get[BigDecimal]("1")))

然后,您可以使用Long将其映射到map (_.longValue)