【问题标题】:Is it possible to implement MySQL JSON_MERGE_PATCH with JOOQ data binding?是否可以使用 JOOQ 数据绑定实现 MySQL JSON_MERGE_PATCH?
【发布时间】:2021-06-26 07:59:55
【问题描述】:

问题:

在我的 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

【问题讨论】:

    标签: mysql sql json kotlin jooq


    【解决方案1】:

    只要 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 函数一样使用它了。

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

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

    【讨论】:

    • 感谢您的回复!这对我有用。只是一个快速的后续问题,您是否建议在这种情况下不要使用绑定,或者无法通过绑定来实现此功能?假设我想让这个更新行为对我的数据库中的所有 JSON 对象通用,
    • “绑定”是指org.jooq.Binding?你没有在你的问题中使用一个,所以我没有在我的答案中使用一个......我会让我的答案更笼统
    • 谢谢!这个通用解决方案很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2017-12-06
    • 2021-11-03
    相关资源
    最近更新 更多