Замена устаревшего PostgresDataType.JSON?

Я использую JOOQ с PostgreSQL и пытаюсь реализовать такой запрос:

INSERT INTO dest_table (id,name,custom_data)
SELECT key as id,
       nameproperty as name,
       CONCAT('{"propertyA": "',property_a,'", "propertyB": "',property_b,'","propertyC": "',property_c,'"}')::json as custom_data
FROM source_table

Бит конкатенации /JSON - это то, о чем я здесь, чтобы спросить. Мне действительно удалось заставить это работать, но только используя это (Kotlin):

val concatBits = mutableListOf<Field<Any>>()
... build up various bits of the concatenation ...
val concatField = concat(*(concatBits.toTypedArray())).cast(PostgresDataType.JSON)

Меня это касается PostgresDataType устарела. Документация говорит, что я должен использовать SQLDataType вместо этого, но он не имеет JSON значение.

Какой рекомендуемый способ сделать это?

РЕДАКТИРОВАТЬ: немного больше информации...

Я строю запрос так:

val innerSelectFields = listOf(
    field("key").`as`(DEST_TABLE.ID),
    field("nameproperty").`as`(DEST_TABLE.NAME),
    concatField.`as`(DEST_TABLE.CUSTOM_DATA)
)

val innerSelect = dslContext
    .select(innerSelectFields)
    .from(table("source_table"))

val insertInto = dslContext
    .insertInto(DEST_TABLE)
    .select(innerSelect)

Начальный запрос, который я разместил, немного вводит в заблуждение, поскольку полученный SQL из этого кода не имеет (id,name,custom_data) часть.

Кроме того, в случае, если это имеет значение, "source_table" является временной таблицей, созданной во время выполнения, поэтому для нее нет автоматически сгенерированных классов.

1 ответ

В настоящий момент jOOQ не поддерживает тип данных JSON из коробки. Основная причина в том, что неясно, к какому типу Java следует привязывать структуру данных JSON, поскольку JDK не имеет такого стандартного типа, и jOOQ не будет предпочитать одну стороннюю библиотеку другой.

В настоящее время рекомендуемый подход заключается в создании собственной настраиваемой привязки типов данных для предпочитаемой вами сторонней библиотеки JSON: https://www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings

В этом случае вам больше не нужно явно приводить переменную bind к какому-либо типу JSON, потому что ваша привязка позаботится об этом прозрачно.

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