我试图使用JOOQ和Jackson将JSON列写入MySQL,但我不知道为什么它不是序列化为JSON,而是作为toString表示.

以下是我为其生成JOOQ定义的表:

create table JsonPayload
(
    name              varchar(127) primary key,
    rules             JSON                 not null,
    defaultValue      tinyint(1) default 0 not null
);

这是我想绑定模型的类.

    data class RuleTest(val name: String, val test: Boolean)

    data class Rule(val name: String, val test: Boolean, val rule: RuleTest)

    data class JsonPayload(val name: String, val rules: List<Rule>, val defaultValue: Boolean)

插入代码:

    dsl.insertInto(JSONPAYLOAD)
        .set(dsl.newRecord(
            JSONPAYLOAD,
            JsonPayload(
                "Test",
                listOf(Rule("rule1", false, RuleTest("rule1", false)),
                    Rule("rule2", true, RuleTest("rule1", false))),
                true
            )
        ))
        .execute()

它可以很好地进行序列化和反序列化,但无法将正确的JSON写入MySQL:

mysql> select * from JsonPayload;
+------+-----------------------------------------------------------------------------------------------------------------------------------------------+--------------+
| name | rules                                                                                                                                         | defaultValue |
+------+-----------------------------------------------------------------------------------------------------------------------------------------------+--------------+
| Test | ["Rule(name=rule1, test=false, rule=RuleTest(name=rule1, test=false))", "Rule(name=rule2, test=true, rule=RuleTest(name=rule1, test=false))"] |            1 |
+------+-----------------------------------------------------------------------------------------------------------------------------------------------+--------------+

这是我为演示这种行为而创建的演示项目https://github.com/v1ctor/jooq-json-demo

你能帮助我理解如何将正确的Json写入MySQL吗?

推荐答案

这是一个有趣的特性 idea ,jOOQ中的DefaultRecordUnmapper实现还不支持这一 idea .我已经为此创建了功能请求:

  • #13604运用DefaultRecordUnmapper中的杰克逊进行反思的可能性
  • #13605在代码生成器中使用现成Jackson转换器的可能性

目前,在reading from数据库时,Jackson只能用于将JSONJSONB映射到您自己的数据 struct .当writing to访问数据库时不会.但是没有任何理由说明反向逻辑也不可用.

同时,您必须实现数据类型Converter<JSON, List<Rule>>(或Binding,如果需要更多功能),并将其附加到生成的代码中,请参阅:

使用Converter的好处是,无论何时读/写此列,都可以获得类型安全性.

Mysql相关问答推荐

加载数据本地infile,字段中有双引号和逗号

MySQL没有使用S隐式附加到此二级索引的主键

插入时发生日期时间字段溢出错误

MySQL工作台的编码问题

Mysql:使用like Select 查询

查询优化并提高性能

将递归 CTE 结果合并到辅助 SQL Select

SQL: Select TEXT 字段的子字符串比整个值快

按年份范围 SQL 查询分组

判断一列中的多个值并返回值 1 或 0

如何在更新语句中使用多个子字符串函数?

如何使用 IF() 条件在 MySQL 中显示真假行

Select 多列但仅按 1 列分组

为什么从我的 SQL 查询中删除 BINARY 函数调用会如此显着地改变查询计划?

自动登录 phpMyAdmin

索引和多列主键

按日期和时间降序排序?

如何用一系列日期填充表格?

如何在 MySQL 中删除此索引?

匹配 IN 子句中的所有值