要替换不推荐使用的PostgresDataType.JSON吗?

时间:2018-12-18 09:22:11

标签: postgresql jooq

我在PostgreSQL上使用JOOQ,并尝试实现这样的查询:

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位。实际上,我确实设法使其正常运行,但是仅通过使用以下命令(科特林)即可:

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 个答案:

答案 0 :(得分:0)

jOOQ当前不支持JSON数据类型。主要原因是目前尚不清楚将JSON数据结构绑定到哪种Java类型,因为JDK没有这种标准类型,并且jOOQ不会偏向于另一个第三方库。

当前推荐的方法是为首选的第三方JSON库创建自己的自定义数据类型绑定: https://www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings

在这种情况下,您将不再需要将绑定变量显式转换为某种JSON类型,因为绑定将透明地进行处理。