我正在努力将 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 许可协议
这种行为非常烦人,因为在 SQL 命令中用作文字字符串时,JSON 字符串可以毫无问题地被接受。
在 postgres 驱动程序 Github 存储库中已经有一个 问题(即使问题似乎是服务器端处理)。
除了在 sql 字符串中使用强制转换(参见@a_horse_with_no_name 的回答)之外,问题作者还提供了两个额外的解决方案:
stringtype=unspecified
。org.postgresql.util.PGobject
中: