我在PostgreSQL上使用JOOQ,并尝试实现这样的查询:
INSERT INTO dest_table
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位。实际上,我确实设法使其正常运行,但是仅通过使用以下命令(科特林)即可:
val concatBits = mutableListOf<Field<Any>>()
... build up various bits of the concatenation ...
val concatField = concat(*(concatBits.toTypedArray())).cast(PostgresDataType.JSON)
custom_data字段具有定义的JSON绑定:
public final TableField<DocumentRecord, JsonNode> CUSTOM_DATA = createField("custom_data", org.jooq.impl.SQLDataType.OTHER, this, "", new JsonNodeBinding())
我正在建立这样的查询:
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)
如果有关系,“ source_table”是在运行时创建的临时表,因此没有为其自动生成的类。
我担心PostgresDataType
已过时。文档说我应该改用SQLDataType
,但是它没有JSON
的值。删除cast()
会给我一个错误column "custom_data" is of type json but expression is of type text
推荐的方法是什么?