Вставьте данные в столбец JSON в postgres, используя JOOQ - PullRequest
1 голос
/ 04 июня 2019

У меня есть база данных postgres, в которую я читаю / пишу, используя JOOQ.В одной из моих таблиц БД есть столбец типа JSON.Когда я пытаюсь вставить данные в этот столбец, используя запрос ниже, я получаю ошибку

Exception in thread "main" org.jooq.exception.DataAccessException: SQL [update "public"."asset_state" set "sites_as_json" = ?]; ERROR: column "sites_as_json" is of type json but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.

Ниже приведен код для вставки данных в столбец

SiteObj s1 = new SiteObj();
s1.setId("1");
s1.setName("Site1");
s1.setGeofenceType("Customer Site");

SiteObj s2 = new SiteObj();
s2.setId("2");
s2.setName("Site2");
s2.setGeofenceType("Customer Site");

List<SiteObj> sitesList = Arrays.asList(s1, s2);
int result = this.dsl.update(as).set(as.SITES_AS_JSON, LambdaUtil.convertJsonToStr(sitesList)).execute();

Вызов LambdaUtil.convertJsonToStr (sitesList) выводит строку, которая выглядит следующим образом ...

[{"id":"1","name":"Site1","geofenceType":"Customer Site"},{"id":"2","name":"Site2","geofenceType":"Customer Site"}]

Что мне нужно сделать, чтобы иметь возможность вставлять в столбец JSON?

1 Ответ

1 голос
/ 04 июня 2019

Чтобы jOOQ правильно связал вашу строку JSON с драйвером JDBC, вам необходимо реализовать привязку типа данных, как описано здесь:

https://www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings

Важным моментом является тот факт, что ваш сгенерированный SQL должен произвести явное приведение типа, например:

@Override
public void sql(BindingSQLContext<JsonElement> ctx) throws SQLException {
    // Depending on how you generate your SQL, you may need to explicitly distinguish
    // between jOOQ generating bind variables or inlined literals.
    if (ctx.render().paramType() == ParamType.INLINED)
        ctx.render().visit(DSL.inline(ctx.convert(converter()).value())).sql("::json");
    else
        ctx.render().sql("?::json");
}
...