jOOQ & PostgreSQL:将从复杂 jsonb 中提取的嵌套 json 对象映射到自定义类型

Posted

技术标签:

【中文标题】jOOQ & PostgreSQL:将从复杂 jsonb 中提取的嵌套 json 对象映射到自定义类型【英文标题】:jOOQ & PostgreSQL: mapping nested json object extracted from complex jsonb into custom type 【发布时间】:2019-12-26 10:19:28 【问题描述】:

我在我的 PostgreSQL 数据库中使用 JSON 对象。堆栈是 Java 11、Spring Boot 2+ 和 spring-boot-jooq-starter。

我经常使用利用 Jackson 的 BindingConverterjsonb 列反序列化为复杂类型。到目前为止一切顺利。

现在我确实有一个更复杂的用例:我有一个查询,它将 json 对象的一部分(在 select 子句中使用 jsonb_column::jsonb ->> nestedObject 运算符)提取到我的记录字段中。

我想将该记录映射到 pojo,以便记录的所有字段都映射到 pojo 的字段(使用 @Column 注释),并且应该将特定的 json 嵌套对象映射到特定的 Java对象。

实现这一目标的正确方法是什么?

有没有办法使用绑定和forcedType 来做到这一点(就像我映射完整的jsonb 列一样)?

我应该求助于RecordMapper 吗?

【问题讨论】:

【参考方案1】:

你需要两个部分来实现这个

1。嵌套对象的数据类型绑定

这可以使用如下代码来实现:

DataType<NestedType> myType = SQLDataType.OTHER.asConvertedDataType(new YourBinding());

在哪里

class YourBinding implements Binding<Object, NestedType>  ... 

此绑定将负责将嵌套对象结构的外观映射到该类型的 Java 表示。您必须直接绑定到 JDBC 才能读取 JSONB 内容。

从 jOOQ 3.12 (see #7242) 开始,将支持原生 JSONB,使用它可以更轻松地实现绑定,即

DataType<NestedType> myType = SQLDataType.JSONB.asConvertedDataType(new YourBinding());
class YourBinding implements Binding<JSONB, NestedType>  ... 

2。一个简单的 SQL 模板,用于表达您的嵌套对象取消嵌套表达式

您无法轻松地向代码生成器提供嵌套对象提取表达式以获取数据,因此您必须使用上述数据类型创建plain SQL template

Field<NestedType> field = DSL.field("jsonb_column::jsonb ->> nestedObject", myType);

您现在可以在所有查询中使用此 field 表达式。

【讨论】:

以上是关于jOOQ & PostgreSQL:将从复杂 jsonb 中提取的嵌套 json 对象映射到自定义类型的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 函数 + 在 jOOQ 中强制转换

jOOQ 无法映射 PostgreSQL 列以使 JPA 满意

使用 JOOQ 更新 PostgreSQL 中的 jsonb 值

将 UNNEST 与 jOOQ 一起使用

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

如何在 PostgreSql 上使用 Jooq 级联截断?