使用 JOOQ 查询 mysql 中的 json 字段

Posted

技术标签:

【中文标题】使用 JOOQ 查询 mysql 中的 json 字段【英文标题】:Querying a json field in mysql using JOOQ 【发布时间】:2020-12-02 01:14:56 【问题描述】:

我有一个事务表,它有一个名为“request”的 json 类型字段。

| Field               | Type         | Null | Key | Default |
| id                  | bigint       | NO   | PRI | NULL    |
| request             | json         | NO   |     | NULL    |
| response            | json         | YES  |     | NULL    |

request 有两个属性 currencyCodeamount

"amount":100000,"currencyCode":"php"

我可以使用以下 mysql 查询来获取这些值

select json_extract(request, "$.amount") as amount, json_extract(request, "$.currencyCode") as currency from transaction;

| amount | currency |
+--------+----------+
| 100000 | PHP      |
| 100000 | PHP      |
| 100000 | PHP      |

我想使用类似这样的 jooq 查询来获取这些值。

DSL.select(<Tables.TRANSACTION.REQUEST.amount>, <Tables.TRANSACTION.REQUEST.currencyCode>)
.from(Tables.TRANSACTION)
.fetch()

如果有人可以帮助我,我真的很感激。

【问题讨论】:

【参考方案1】:

使用 jOOQ 3.14 的 JSON_VALUE 支持

从 jOOQ 3.14 开始,您将能够使用新的内置标准 JSON 运算符支持,例如JSON_VALUE()。根据文档:

这个例子使用了 jOOQ:

jsonValue(val(JSON.json("[1,2]")), "$[*]")

翻译成以下方言特定的表达方式:

...
-- MYSQL
json_extract('[1,2]', '$[*]')

在 jOOQ 3.13 及更早版本中使用纯 SQL 模板

当 jOOQ 不支持开箱即用的供应商特定功能时,您可以求助于使用 plain SQL templating。随便写:

public static Field<String> jsonExtract(Field<?> field, String jsonPath) 
  return DSL.field("json_extract(0, 1)", String.class, field, DSL.inline(jsonPath));

【讨论】:

以上是关于使用 JOOQ 查询 mysql 中的 json 字段的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MySQL JOOQ 重命名表查询范围限定为同一个数据库?

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

如何在 jOOQ 中转换“to_json()”PostgreSQL 函数?

Jooq 使用 MySql 中的记录批量更新

MySQL POLYGON ←→ Jts Polygon with JOOQ (as WKT)

如何在 jOOQ 中使用 formatJSON(JSONFormat) 正确格式化生成的 JSON 类型的常规结果?