是否可以使用 JOOQ 数据绑定实现 MySQL JSON_MERGE_PATCH?

Is it possible to implement MySQL JSON_MERGE_PATCH with JOOQ data binding?

问题:

在我的 MySQL 数据库中,我有一个 JSON 类型的 info 列:info json DEFAULT NULL,

我写了一个简单的转换器如下,并注册到代码生成器:

class JsonMapConverter : AbstractConverter<JSON, Map<*, *>>(JSON::class.java, Map::class.java) {
    override fun from(databaseObject: JSON?): Map<*, *> =
        jacksonObjectMapper().readValue(databaseObject.toString(), Map::class.java)

    override fun to(userObject: Map<*, *>): JSON =
        JSON.json(jacksonObjectMapper().writeValueAsString(userObject))
}

使用此转换器插入和更新工作正常。但是,现在我想用 MySQL 的 JSON_MERGE_PATCH 更新 JSON 字段,而不是在每次更新时简单地替换整个 JSON 对象。

我想到了jOOQ数据绑定,但是研究了一段时间后,我开始头晕目眩,因为我对JDBC.

真的可以用 jOOQ 数据绑定实现我想要的吗?

版本:

每当 jOOQ 缺少对供应商特定功能的支持时,请使用 plain SQL templating

fun jsonMergePatch(vararg fields: Field<Map<*, *>>): Field<Map<*, *>> = DSL.field(
    "json_merge_patch({0})", 
    SQLDataType.JSON.asConvertedDataType(JsonMapConverter()),
    DSL.list(*fields)
);

现在您可以像使用普通的 jOOQ 函数一样使用它了。

或者,如果您不想 link 将此功能用于特定转换器,请执行以下操作:

fun <T> jsonMergePatch(vararg fields: Field<T>): Field<T> = DSL.field(
    "json_merge_patch({0})", 
    fields[0].getDataType(),
    DSL.list(*fields)
);