2016-08-31 2 views
1

Dies ist die Abfrage, die ich ausführen versuche:Mit Rohwert-Ausdrücke in UPDATE mit jOOQ

UPDATE TABLE users SET metadata = metadata - 'keyA' - 'keyB' 
    WHERE <condition>; 

Hier metadata vom Typ jsonb und der - Operator entfernt einen Schlüssel aus dem Objekt JSON. Allerdings, wenn ich dies in jOOQ tun:

this.ctx.update(Tables.USERS) 
    .set(Tables.USERS.METADATA, "metadata-'keyA'-'keyB'") 
    .where(<condition>) 
    .execute(); 

ich eine Fehlermeldung, dass die value ist ein CHARACTER VARYING und nicht JSONB, die ich raten bin, ist, weil die Abfrage mit einem bind Wert erstellt wird, und dann ganz string versucht, eingefügt zu werden und nicht als Ausdruck.

Wie führe ich diesen Wertausdruck in jooq aus?

Antwort

1

Was Sie mit dem Set-Methode vorbei sind:

"metadata-'keyA'-'keyB'" 

... ist nicht ein Ausdruck, der direkt in die resultierende SQL-Zeichenfolge injiziert wird. Es ist eine Bindevariable vom Typ String (d. H. VARCHAR). Der einfachste Weg wäre, mit „plain SQL“ greifen:

.set(USERS.METADATA, field(
    "{0} - {1} - {2}", 
    USERS.METADATA.getDataType(), 
    USERS.METADATA, val("keyA"), val("keyB") 
)) 

Für weitere Informationen im Zusammenhang mit „plain SQL“ mit jOOQ verwenden, finden Sie in diesem Abschnitt des Handbuchs: http://www.jooq.org/doc/latest/manual/sql-building/plain-sql