【问题标题】:How can I save a JSON object in a separate type?如何将 JSON 对象保存为单独的类型?
【发布时间】:2020-08-25 03:26:58
【问题描述】:

我一直在尝试使用 Java 和 PreparStatement 在 Postgres 中保存一个 JSON 数组半个永恒。

我在 Postgres 中使用自己的类型。

不幸的是,我总是收到类型错误消息

这是我的 Postgres 函数,用于将数据插入到我的表中:

CREATE OR REPLACE FUNCTION "Portfolio"."Einfuegen"(
"dokumenteIN" "Portfolio".t_dokumente[],
"finanzenIN" numeric[],
"bildIN" bytea)
RETURNS character varying
LANGUAGE 'plpgsql'

COST 100
VOLATILE 
AS $BODY$
BEGIN
  INSERT INTO "Portfolio"."Historie" (dokumente,finanzen,bild) VALUES 
("dokumenteIN","finanzenIN","bildIN");
return 'Gesichert';
END;
$BODY$;

我的自定义类型如下所示:

 CREATE TYPE "Portfolio".t_dokumente AS
(
 inhalt json[]
);

ALTER TYPE "Portfolio".t_dokumente
OWNER TO postgres;

我正在尝试使用 Java 插入一些 JSON 数组数据:

    for (int i = 0; i < arrayDokus.length(); ++i) {

        JSONObject rec = arrayDokus.getJSONObject(i);
        String nameBild = rec.getString("Name");
        String inhalt = rec.getString("Inhalt");

        byte[] in = inhalt.getBytes();

        try {
            Blob blob = new SerialBlob(in);

            JSONObject neuesObjekt = new JSONObject();
            neuesObjekt.append("Name", nameBild);
            neuesObjekt.append("Inhalt", blob);

            where.add(neuesObjekt);
            
            

        } catch (SerialException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

   
    PGobject jsonObject = new PGobject();
    jsonObject.setType("json[]");
    jsonObject.setValue(where.toString());


    PreparedStatement stmt = con.prepareStatement("SELECT * FROM \"Portfolio\".\"Einfuegen\" 
   (?::\"Portfolio\".t_dokumente[],?,?)");
            
        
            stmt.setObject(1, jsonObject);
            stmt.setArray(2, f);
            stmt.setBinaryStream(3,in);
            ResultSet rs = stmt.executeQuery();
            con.commit();

          [...]

但我得到了错误:

org.postgresql.util.PSQLException:错误:无法将类型 json [] 转换为类型“Portfolio”.t_dokumente []

【问题讨论】:

  • 与你的问题无关,但是:你真的应该避免那些可怕的引用标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/…
  • 你的数据结构很奇怪,列dokumente是一个complex数组,每个complex都有一个字段inhalt——一个json数组,为什么不直接使用JSONB呢?跨度>

标签: postgresql


【解决方案1】:

"dokumenteIN" "Portfolio".t_dokumente[] 表示您想要一个 Postgres 数组 t_dokumente,它本身就是 json[]。这使它成为json[][]:JSON 的 Postgres 数组的 Postgres 数组。类似array[['{"foo": 23}'::json]]

"Portfolio".t_dokumente[] 是具有单个字段的复合类型:inhalt。我不知道如何做到这一点。

这是不必要的复杂。 JSON 已经支持数组和键/值对。最简单的方法就是使用jsonb:dokumenteIN jsonbjsonb,而不是 json,因为它总体上效率更高。

主要的实际区别在于效率。 json 数据类型存储输入文本的精确副本,处理函数必须在每次执行时重新解析;而 jsonb 数据以分解的二进制格式存储,由于增加了转换开销,因此输入速度稍慢,但处理速度明显加快,因为不需要重新解析。 jsonb 还支持索引,这是一个显着的优势。

然后您可以使用 JSON 对象的 JSON 数组:'[{"inhalt": "first"}, {"inhalt": "second"}]'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2021-11-28
    • 2014-08-06
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多