是否可以使用 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: 3.14.4
- 科特林:1.4.10
- 数据库:MySQL 5.7.32
每当 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)
);
问题:
在我的 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: 3.14.4
- 科特林:1.4.10
- 数据库:MySQL 5.7.32
每当 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)
);