我很难将JSON对象插入到postgres v9.4DB中。我已经将名为"evtjson“的列定义为json类型(而不是jsonb)。
我试图使用Java中的准备语句( JEE 1.8)将Json对象(使用JEE javax.json库构建)插入到列中,但我仍然会遇到SQLException错误。
我使用以下方法创建JSON对象:
JsonObject mbrLogRec = Json.createObjectBuilder().build();
…
mbrLogRec = Json.createObjectBuilder()
.add("New MbrID", newId)
.build();然后,我将这个对象作为参数传递给另一个方法,以便使用准备好的语句将其写入DB。(连同其他几个领域)如下:
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)
我也尝试过:
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,但是我找不到对这些参数的任何引用。
我要不要试试setAsciiStream?CharacterStream?CLOB?
发布于 2016-03-07 13:38:58
这种行为非常恼人,因为在SQL命令中作为文字字符串使用时,JSON字符串是被接受的,没有问题。
在postgres驱动程序Github存储库中已经有一个问题 (即使问题似乎是服务器端处理)。
除了在sql字符串中使用强制转换(请参阅@a_horse_with_no_name的答案)之外,问题作者还提供了两个额外的解决方案:
stringtype=unspecified。这告诉PostgreSQL,所有文本或varchar参数实际上都是未知类型,可以更自由地推断它们的类型。
org.postgresql.util.PGobject中
PGobject jsonObject = new PGobject();
jsonObject.setType("json");
jsonObject.setValue(yourJsonString);
pstmt.setObject(11, jsonObject);发布于 2016-03-07 15:06:51
您可以这样做,只需要json字符串:
将查询更改为:
String query = "INSERT INTO table (json_field) VALUES (to_json(?::json))"并将参数设置为字符串。
pStmt.setString(1, json);发布于 2018-04-18 19:39:04
你有两个选择:
我个人更喜欢后者,因为查询更干净。
https://stackoverflow.com/questions/35844138
复制相似问题