java - jOOQ 和 PostgreSQL : mapping nested json object extracted from complex jsonb into custom type

标签 java json postgresql jooq

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

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

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

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

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

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

我应该求助于 RecordMapper 来做到这一点吗?

最佳答案

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

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

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

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

在哪里

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

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

从 jOOQ 3.12 ( see #7242 ) 开始,将有原生的 JSONB 支持,使用它你可以更容易地实现你的绑定(bind),即

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);

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

关于java - jOOQ 和 PostgreSQL : mapping nested json object extracted from complex jsonb into custom type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57586502/

相关文章:

java - 如何在java中做一个数字键盘

java - 如何连接到 Java 中的 SVN 服务器等等?

iOS - 将 IFNULL(...) JSON 键转换为对象属性

java - 如何将 POJO 映射到多个 JSON 表示

java - 如何将 JSON 数组映射/反序列化为 POJO 或 POJO 列表?

java - 解决 Codility PermMissingElem 测试的正确方法是什么? ( java )

java - EasyMock:将对象与其克隆进行比较时出现断言错误

postgresql - 将 CSV 文件导入 PostgreSQL 时忽略引号?

ruby-on-rails - Rails 3.2 中的 PostgreSQL DATALINK 类型

sql - 如何为这个特定的表关系建模