【问题标题】:insert BigDecimal to database with vertx-jdbc使用 vertx-jdbc 将 BigDecimal 插入数据库
【发布时间】:2018-02-05 10:15:51
【问题描述】:

我正在使用 vertx-jdbc-client (http://vertx.io/docs/vertx-jdbc-client/java/) 进行数据库连接。这适用于除 BigDecimal 之外的所有数据类型。

在我的数据库中,类型是 decimal(13,2),在 Java 中,我使用的是 BigDecimal 数据类型。我只想使用 vertx-jdbc-client 阅读和更新本专栏。

不幸的是,我得到了以下异常:

    SEVERE: Unhandled exception
java.lang.IllegalStateException: Illegal type in JsonObject: class java.math.BigDecimal
    at io.vertx.core.json.Json.checkAndCopy(Json.java:215)
    at io.vertx.core.json.JsonArray.add(JsonArray.java:444)

查看 io.vertx.core.json.Json.checkAndCopy 告诉我框架不支持 BigDecimal:

@SuppressWarnings("unchecked")
  static Object checkAndCopy(Object val, boolean copy) {
    if (val == null) {
      // OK
    } else if (val instanceof Number && !(val instanceof BigDecimal)) {
      // OK
    } else if (val instanceof Boolean) {
...
}

我用谷歌搜索了一下,但没有找到解释为什么不支持。

有解决办法吗?

使用以下版本: (Java 8、Vertx 3.5.0、Postgres 9.6)

【问题讨论】:

    标签: java jdbc bigdecimal vert.x


    【解决方案1】:

    您可以将BigDecimal 转换为String,然后使用CAST 函数:

    INSERT INTO test (i) VALUES (CAST('3.235' AS DECIMAL))
    

    然后再读一遍:

    SELECT CAST(i AS TEXT) from test
    

    【讨论】:

    • 非常感谢,这正在工作。一个缺点是不能使用来自 Vert.x 代码生成的@DataObject(generateConverter = true),因为代码生成忽略了 BigDecimal 类型。你知道告诉转换器接受 BigDecimal 的方法吗?
    • 不,你不能告诉转换者接受BigDecimal。但由于转换器需要从用户代码中调用,您可以在使用它的方法中为BigDecimal 字段添加一些内容。
    • 好,知道了。我手动添加了它,但我更喜欢另一种解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多