我在Play 2.0.2中使用带有Anorm的Derby数据库。即使没有列有BigDecimal
字段,插入表时也会出现以下错误。
执行异常[[RuntimeException:TypeDoesNotMatch(无法将1:类java.math.BigDecimal转换为Long为列.1)]]
如果我查看表格,我可以看到我的数据已经输入,所以我推断问题与返回新密钥有关。但我清楚地将密钥声明为bigint
- 为什么抱怨BigDecimal
?
答案 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)
。