如何使用 Java preparedStatement 将 JSON 对象插入到 Postgres 中?

新手上路,请多包涵

我正在努力将 JSON 对象插入到我的 postgres v9.4 数据库中。我已将名为“evtjson”的列定义为类型 json (不是 jsonb )。

我正在尝试使用 Java (jdk1.8) 中的准备语句将 Json 对象(使用 JEE javax.json 库构建)插入到列中,但我一直遇到 SQLException 错误。

我使用以下方法创建 JSON 对象:

 JsonObject mbrLogRec = Json.createObjectBuilder().build();
…
mbrLogRec = Json.createObjectBuilder()
                .add("New MbrID", newId)
                .build();

然后我将该对象作为参数传递给另一个方法,以使用准备好的语句将其写入数据库。 (连同其他几个字段)作为:

 pStmt.setObject(11, dtlRec);

使用此方法,我收到以下错误:

org.postgresql.util.PSQLException:没有安装 hstore 扩展。在 org.postgresql.jdbc.PgPreparedStatement.setMap(PgPreparedStatement.java:553) 在 org.postgresql.jdbc.PgPreparedStatement.setObject(PgPreparedStatement.java:1036)

我也试过:

 pStmt.setString(11, dtlRec.toString());
pStmt.setObject(11, dtlRec.toString());

这会产生不同的错误:

事件 JSON:{“New MbrID”:29}

SQLException:错误:列“evtjson”的类型为 json,但表达式的类型为字符变化

提示:您将需要重写或转换表达式。

但是,至少这告诉我数据库将该列识别为 JSON 类型。我确实尝试安装 hstore 扩展,但它告诉我它不是 hstore 对象。

OracleDocs 显示了多种在 preparedStatement 中设置参数值的方法,但如果有人知道答案,我宁愿不尝试所有方法。 ( http://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html ) 这些还引用了一个附加参数 SQLType,但我找不到对这些的任何引用。

我应该试试 setAsciiStream 吗? CharacterStream ?克洛布?

原文由 MaybeWeAreAllRobots 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

这种行为非常烦人,因为在 SQL 命令中用作文字字符串时,JSON 字符串可以毫无问题地被接受。

在 postgres 驱动程序 Github 存储库中已经有一个 问题(即使问题似乎是服务器端处理)。

除了在 sql 字符串中使用强制转换(参见@a_horse_with_no_name 的回答)之外,问题作者还提供了两个额外的解决方案:

  1. 在 JDBC 连接 URL/选项中使用参数 stringtype=unspecified

这告诉 PostgreSQL 所有文本或 varchar 参数实际上都是未知类型,让它更自由地推断它们的类型。

  1. 将参数包装在 org.postgresql.util.PGobject 中:
  PGobject jsonObject = new PGobject();
 jsonObject.setType("json");
 jsonObject.setValue(yourJsonString);
 pstmt.setObject(11, jsonObject);

原文由 wero 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题