gpt4 book ai didi

java - 如何使用 JavapreparedStatement 将 JSON 对象插入 Postgres?

转载 作者:IT老高 更新时间:2023-10-28 12:47:12 26 4
gpt4 key购买 nike

我正在努力将 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: No hstore extension installed. at org.postgresql.jdbc.PgPreparedStatement.setMap(PgPreparedStatement.java:553) at org.postgresql.jdbc.PgPreparedStatement.setObject(PgPreparedStatement.java:1036)

我也试过了:

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

产生不同的错误:

Event JSON: {"New MbrID":29}

SQLException: ERROR: column "evtjson" is of type json but expression is of type character varying

Hint: You will need to rewrite or cast the expression.

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

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

我应该尝试 setAsciiStream 吗? CharacterStream? CLOB?

最佳答案

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

已经有一个 issue在 postgres 驱动程序 Github 存储库中对此进行处理(即使问题似乎出在服务器端处理上)。

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

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

This tells PostgreSQL that all text or varchar parameters are actually of unknown type, letting it infer their types more freely.

  1. 将参数包装在 org.postgresql.util.PGobject 中:

 PGobject jsonObject = new PGobject();
jsonObject.setType("json");
jsonObject.setValue(yourJsonString);
pstmt.setObject(11, jsonObject);

关于java - 如何使用 JavapreparedStatement 将 JSON 对象插入 Postgres?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35844138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com