我在我的 PostgreSQL 数据库中使用 JSON 对象。堆栈是 Java 11,带有 spring-boot-jooq-starter 的 Spring Boot 2+。
我经常使用 Binding
和利用 Jackson 的 Converter
将 jsonb
列反序列化为复杂类型。到目前为止一切顺利。
现在我确实有一个更复杂的用例:我有一个提取 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/