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

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");
}
Всем, кому интересно, как реализовать функцию
LambdaUtil.convertJsonToStr, можно использовать пакеты Jackson или GSON, примеры здесь и здесь.