mysql - 如何在 jOOQ for MySQL 8 中实现 JSON_SET()

标签 mysql json sql-update jooq

我有一个带有 JSON col 的表

--------------------------------------
Col1 | Col2 | JSON_col | Key1 | Key2 |
--------------------------------------

JSON_Col的结构是Map,所以在DB中是{0: {data here}}

我需要实现这样的功能:

update <table> set JSON_Col = JSON_SET(JSON_Col, $.key1, data1, $.key2, data2) 
where <condition>

我怎么能在 jOOQ 中写这样的东西。

最佳答案

在未来的 jOOQ 版本中,我们将支持额外的内置 JSON 功能,JSON_SET 可能是其中的一部分 (see #10018)。

从 jOOQ 3.12 开始,您可以编写自己的 jOOQ 扩展,就像不支持某些供应商特定功能时一样,使用 plain SQL templating ,例如

public static Field<JSON> jsonSet(Field<JSON> field, Map<String, String> map) {
    StringBuilder sb = new StringBuilder();
    String separator = "";
    int i = 1;
    for (var e : map.entrySet()) {
        sb.append(separator);
        sb.append("$.").append(e.getKey()).append(", {").append(i++).append("}");

        separator = ", ";
    }

    List<QueryPart> queryParts = new ArrayList<>();
    queryParts.add(field);
    for (var v : map.values())
        queryParts.add(DSL.val(v));

    return DSL.field("json_set({0}, " + sb.toString() + ")",
        field.getDataType(),
        queryParts.toArray(new QueryPart[0]));
}

然后,像这样使用它:

ctx.update(TABLE)
   .set(TABLE.JSON_COL, jsonSet(TABLE.JSON_COL, Map.of("key1", "data1", "key2", "data2")))
   .where(...)
   .execute();

关于mysql - 如何在 jOOQ for MySQL 8 中实现 JSON_SET(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708786/

相关文章:

mysql + 更新前 n

json - 如何迭代层次结构中的 JSON 对象?

java - 将字符串数组作为 POST 传递给 PHP

javascript - 我的 HTML 代码无法在 Javascript/JSON 上读取

mysql - UPDATE 和 SELECT - 在选择查询中使用从更新调用的表

PHP/MySQL 不再从表单更新数据库

mysql - 从mysql中的同一个表更新多行

mysql - 如何在 MySQL 中存储键值对?

PHP:for 循环两次显示相同的结果而不是两个不同的结果?

sql - 在 PostgreSQL 中的一个查询中更新具有不同主键的多行?