Вставьте данные в столбец JSON в postgres, используя JOOQ

У меня есть база данных 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?

Всем, кому интересно, как реализовать функцию LambdaUtil.convertJsonToStr, можно использовать пакеты Jackson или GSON, примеры здесь и здесь.

Matt 21.12.2021 19:10
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
2
1
2 568
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Текущие версии jOOQ

jOOQ изначально поддерживает типы данных JSON и JSONB. Вам не нужно делать ничего нестандартного.

Исторический ответ

Чтобы 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");
}

Другие вопросы по теме