当前位置: 首页 > 知识库问答 >
问题:

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

阳长恨
2023-03-14

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

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

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

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

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

pStmt.setObject(11, dtlRec);

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

组织。postgresql。util。PSQLException:未安装hstore扩展。在org。postgresql。jdbc。PgPreparedStatement。org上的setMap(PgPreparedStatement.java:553)。postgresql。jdbc。PgPreparedStatement。setObject(PgPreparedStatement.java:1036)

我也尝试过:

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

这会产生不同的错误:

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

SQLException: ERROR:列"evtjson"是json类型,但表达式类型不同

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

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

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

我应该尝试setAsciiStream吗?特征流?CLOB?

共有3个答案

汤念
2023-03-14

您有两种选择:

>

  • 使用语句。设置字符串(jsonStr),然后在sql语句中处理转换:

    PreparedStatement statement = con.prepareStatement(
      "insert into table (jsonColumn) values (?::json)");
    statement.setString(1, jsonStr);
    

    另一种选择是使用PGobject创建自定义值包装。

    PGobject jsonObject = new PGobject();
    PreparedStatement statement = con.prepareStatement(
      "insert into table (jsonColumn) values (?)");
    jsonObject.setType("json");
    jsonObject.setValue(jsonStr);
    statement.setObject(1, jsonObject);
    

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

  • 拓拔野
    2023-03-14

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

    将查询更改为:

    String query = "INSERT INTO table (json_field) VALUES (to_json(?::json))"
    

    并将参数设置为字符串。

    pStmt.setString(1, json);
    
    葛言
    2023-03-14

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

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

    除了在sql字符串中使用cast(请参阅@a\u horse\u with_no\u name)的答案),本期作者还提供了两个额外的解决方案:

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

    这告诉PostgreSQL,所有text或varchar参数实际上都是未知类型的,因此可以更自由地推断其类型。

     PGobject jsonObject = new PGobject();
     jsonObject.setType("json");
     jsonObject.setValue(yourJsonString);
     pstmt.setObject(11, jsonObject);
    
     类似资料:
    • 问题内容: 我正在尝试从url获取JSON数据。它是以对象的形式,我必须将对象数据推送到数组中。 我如上所述在my_json var中尝试过,我以对象形式存在json数据,现在我必须将该对象存储为var数据作为以下格式的数组 谁能帮我怎么做?谢谢 问题答案: 观察 如果只有一个对象,而您想将整个对象压入一个数组,则无需迭代该对象。 试试这个 : 代替 :

    • 问题内容: 我想在我的SQL Server 2016表中插入一些JSON对象。 我的表结构如下: 我正在使用以下查询来插入我的数据: 但是,表中仅填充和的值。这两个和值是NULL。 我的查询出了什么问题?如何将JSON对象作为nvarchar插入? 问题答案: 我承认我对SQL Server 2016中的JSON内容没有任何经验,但是请看一下本教程: https://docs.microsoft.

    • 问题内容: 试图让我了解BS的html构建。 我正在尝试插入新标签: 当我检查结果时,我得到: 因此,我要插入一个针对Websafe html进行了清理的字符串。 我希望看到的是: 如何在带有ID的位置3中插入新标签? 问题答案: 使用工厂方法创建新元素: 并插入:

    • 我试图在集合中插入一个对象,我重载了' 但我仍然得到以下错误: /home/joju/NetBeansProjects/cppu 1/main。cpp:51:对“domino::domino(int,int)”的未定义引用 build/Debug/GNU-Linux-x86/main。o:在函数`std::less::operator()(domino const)中 /usr/include/c

    • 问题内容: 我有一系列数据要输入数据库。输入数据的用户界面不适用于批量输入,因此我尝试制定等效的命令行。当我检查Chrome中UI的网络请求时,看到了json对象的PUT请求。当我尝试复制请求时 我得到一个错误 curl:(3)位置X不支持[globbing]嵌套括号 其中X是第一个“ [”的字符位置。 如何放置包含数组的json对象? 问题答案: 您的命令行应该在要发送到PUT中的字符串之前插入

    • 问题内容: 我想在REST应用程序中接受和响应JSON对象。我需要发送和接收的数据在.properties文件中。我已经阅读了它们,现在位于Object(From )中。是否可以在不实现新类的情况下编组和解组对象? 我在Weblogic服务器中使用Jax-rs API。 问题答案: 对WebLogic不太熟悉,因此我不知道它使用的是哪个版本的Jersey(1.x或2.x),但是使用1.x,您可以简