Re: Inserting JSON via Java PreparedStatment

From: Curt Huffman <curt(dot)huffman(at)gmail(dot)com>
To: rob stone <floriparob(at)gmail(dot)com>
Cc: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>, "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: Inserting JSON via Java PreparedStatment
Date: 2016-03-08 03:15:36
Message-ID: CACaG-nHaAEsksm8DfyirSJx4VF0arrEsiJ-SgNN2DZuRaEMEaA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Thanks Rob & David!

I got it to work using the following:

String qry = "INSERT INTO event "
+ "(spotid, qid, userid, persid, ...., "
+ "evtvalue, evtdt, evtjson) "
+ "VALUES(?,?,?,?,?,?,?,?,?,?,to_json(?::json));";

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

(another suggestion was to use: cast(? as json) which I haven't tried
yet.)

This worked with an ultra-simple, 1-pair json object. {"New MbrID":34}
I'll try it with more complex structures next.

Any opinions on using the postgres function, to_json, over the cast?

However, from my (limited) understanding, I think I am now just incurring
additional processing overhead from all of this.
I think that I am stuffing text into a JSON object, then converting it into
a string for the preparedStatment, which then passes it to the JDBC driver
to re-convert it into a JSON object, and gets ultimately stored as a text
string in the column? Is that correct?
I suspect I'll have to reverse the process to read it back out, yes?

Follow-up questions:
1) Since I'm not (yet) using JSONB, but just regular JSON column, is there
much point to even using a JSON column?
2) Will this method also work for JSONB column types?

Finally, I humbly request a small addition to the postgres doco that
illustrates this and the 'best' way to insert, manipulate, and retrieve
JSON in postgres. Maybe even a small tutorial?

Thanks again!
-Curt

On Tue, Mar 8, 2016 at 4:18 AM, rob stone <floriparob(at)gmail(dot)com> wrote:

> On Mon, 2016-03-07 at 09:32 -0700, David G. Johnston wrote:
> >
> > >
> > > Hint: You will need to rewrite or cast the expression.
> > >
> > Take the hint, literally. You never did show the SQL but usually the
> > least complex way to solve this is to indeed transfer the data as a
> > string/text and then instruction PostgreSQL to convert (i.e., cast)
> > it to json.
> >
> > SELECT (?)::json; <-- that ? parameter is seen as text; then you
> > convert it. The parentheses should be optional but I use them to
> > emphasize the point.
> >
> > then
> >
> > pStmt.setString(1, dtlRec.toString());
> >
> > David J.
> >
>
> For some reason there is no java.sql.Type = JSON. There is ARRAY
> though.
>
> I would have written this:-
>
> JsonObject mbrLogRec = Json.createObjectBuilder().build();
> mbrLogRec = Json.createObjectBuilder()
> .add("New MbrID", newId)
> .build();
>
> as
>
> JsonObject mbrLogRec = Json.createObjectBuilder().add("New MbrID",
> newId);
>
> pStmt.setObject(11, mbrLogRec);
>
> If you pass a string to your prepared statement and want to cast it in
> your INSERT/UPDATE statement, you will probably have to include the
> double quotes, colons and commas. Never tried it, just a guess.
> Could become complicated when you have multiple pairs of JSON
> attributes.
>
> E.g.
>
> JsonObject mbrLogRec = Json.createObjectBuilder().add("New MbrID",
> newId).add("Old MbrID","fred");
>
>
> I'm sorry but I don't have time at the moment to knock up a test
> program and verify any of this. I'm not an expert on JSON objects in
> Java.
>
> Just my two bob's worth.
>
> HTH,
> Rob
>
>

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message David G. Johnston 2016-03-08 03:35:06 Re: Inserting JSON via Java PreparedStatment
Previous Message Craig Ringer 2016-03-08 02:05:04 Re: Slave-Master replication on top of BDR