如何使用基于 jsontype 属性的 jOOQ 从数据库中检索数据

Posted

技术标签:

【中文标题】如何使用基于 jsontype 属性的 jOOQ 从数据库中检索数据【英文标题】:How to retrieve data from database using jOOQ based on jsontype properties 【发布时间】:2022-01-11 09:59:00 【问题描述】:

我们有一个带有 json 类型地址列的 Employee 表,如下所述

员工表:

如何使用jOOQ根据地址栏中的城市名称检索员工详细信息?

【问题讨论】:

【参考方案1】:

你可以使用jOOQ内置的JSON_VALUE()支持:

ctx.selectFrom(EMPLOYEE)
   .where(cast(jsonValue(EMPLOYEE.ADDRESS, "$.city"), VARCHAR).eq("\"Mumbai\""))
   .fetch();

这是假设您使用代码生成并具有通常的静态导入:

import static org.jooq.impl.DSL.*;
import static org.jooq.impl.SQLDataType.*;

如果您需要对 jOOQ 不支持的任何其他特定于供应商的 JSON 函数(目前)的支持,请改用普通 SQL 模板。

但是,这种方法不太可能利用索引,所以如果可以的话,我建议对这些数据进行规范化。

【讨论】:

不起作用,它总是返回 0 行。我已经使用 getSQL() 函数来查看带有 cast() 的输出: select employee .name from employee where cast(json_extract(employee.address, ?) as char) = ?选择employee .name from employee where cast(json_extract(employee.address, "$.city") as char) = "Delhi";总是返回 0 行 是的,我的错。提取的内容是 JSON 字符串,而不是 SQL 字符串。再试一次更新的答案,另见dbfiddle 工作!!我有另一种方法,它也可以在没有转义字符 ctx.selectFrom(EMPLOYEE) .where(DSL.field("json_extract(employee.address, "$.car")", VARCHAR) 的情况下使用。 eq("孟买")) .fetch(); 是的,当然,您可以随时使用纯 SQL 模板

以上是关于如何使用基于 jsontype 属性的 jOOQ 从数据库中检索数据的主要内容,如果未能解决你的问题,请参考以下文章

如何一起使用Spring启动,JOOQ和Flyway?

JOOQ快速上手(基于springboot 和 postgresql)

如何使用实体 bean 类名和属性名生成类和属性?

内部属性不会在 JOOQ 中自动转换

JOOQ + JPA 实体

基于多个值对地图进行排序(Java8/Jooq)