首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Java preparedStatement将JSON对象插入Postgres?

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

Stack Overflow用户
提问于 2016-03-07 12:46:18
回答 8查看 89.4K关注 0票数 67

我很难将JSON对象插入到postgres v9.4DB中。我已经将名为"evtjson“的列定义为json类型(而不是jsonb)。

我试图使用Java中的准备语句( JEE 1.8)将Json对象(使用JEE javax.json库构建)插入到列中,但我仍然会遇到SQLException错误。

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

代码语言:javascript
复制
JsonObject mbrLogRec = Json.createObjectBuilder().build();
…
mbrLogRec = Json.createObjectBuilder()
                .add("New MbrID", newId)
                .build();

然后,我将这个对象作为参数传递给另一个方法,以便使用准备好的语句将其写入DB。(连同其他几个领域)如下:

代码语言:javascript
复制
pStmt.setObject(11, dtlRec);

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

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

我也尝试过:

代码语言:javascript
复制
pStmt.setString(11, dtlRec.toString());
pStmt.setObject(11, dtlRec.toString());

会产生不同的错误:

事件JSON:{“新MbrID":29} SQLException:错误:列"evtjson“的类型为json,但表达式的类型是变化的。 提示:您需要重写或转换表达式。

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

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

我要不要试试setAsciiStreamCharacterStream?CLOB?

EN

回答 8

Stack Overflow用户

发布于 2016-03-07 13:38:58

这种行为非常恼人,因为在SQL命令中作为文字字符串使用时,JSON字符串是被接受的,没有问题。

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

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

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

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

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

代码语言:javascript
复制
 PGobject jsonObject = new PGobject();
 jsonObject.setType("json");
 jsonObject.setValue(yourJsonString);
 pstmt.setObject(11, jsonObject);
票数 85
EN

Stack Overflow用户

发布于 2016-03-07 15:06:51

您可以这样做,只需要json字符串:

将查询更改为:

代码语言:javascript
复制
String query = "INSERT INTO table (json_field) VALUES (to_json(?::json))"

并将参数设置为字符串。

代码语言:javascript
复制
pStmt.setString(1, json);
票数 43
EN

Stack Overflow用户

发布于 2018-04-18 19:39:04

你有两个选择:

  1. 使用statement.setString(jsonStr),然后在sql语句中处理转换: PreparedStatement语句= con.prepareStatement(“插入表(jsonColumn)值(?::json)");statement.setString(1,jsonStr);
  2. 另一种选择是使用PGobject创建自定义值包装器。 PGobject jsonObject =新PGobject();PreparedStatement语句= con.prepareStatement(“插入表(jsonColumn)值(?)");jsonObject.setType("json");jsonObject.setValue(jsonStr);statement.setObject(1,jsonObject);

我个人更喜欢后者,因为查询更干净。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35844138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档