반 영원 동안 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 [] 유형으로 변환 할 수 없습니다.
"dokumenteIN" "Portfolio".t_dokumente[]
당신이 원하는 말한다 포스트 그레스 의 배열 t_dokumente
자체 인을 json[]
. 그것은 그것을 만든다 json[][]
: JSON의 Postgres 배열의 Postgres 배열. 같은 것 array[['{"foo": 23}'::json]]
.
그러나 "Portfolio".t_dokumente[]
단일 필드가있는 복합 유형 인 흡입입니다. 어떻게 작동하는지 잘 모르겠습니다.
이것은 불필요하게 복잡합니다. JSON은 이미 배열 및 키 / 값 쌍을 지원합니다. 할 수있는 가장 간단한 것은 바로 사용하는 것입니다 jsonb
: dokumenteIN jsonb
. jsonb
, 아닙니다 json
. 왜냐하면 전반적으로 훨씬 더 효율적이기 때문입니다.
실질적인 주요 차이점은 효율성입니다. json 데이터 유형은 입력 텍스트의 정확한 사본을 저장하며, 처리 함수는 각 실행에서 재분석해야합니다. jsonb 데이터는 분해 된 바이너리 형식으로 저장되어 추가 된 변환 오버 헤드로 인해 입력 속도가 약간 느리지 만 재분석이 필요하지 않으므로 처리 속도가 훨씬 빠릅니다. jsonb는 인덱싱도 지원하므로 상당한 이점이 될 수 있습니다.
그런 다음 JSON 객체의 JSON 배열을 사용할 수 있습니다 '[{"inhalt": "first"}, {"inhalt": "second"}]'
..
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다