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 的 Binding
和 Converter
将 jsonb
列反序列化为复杂类型。到目前为止一切顺利。
现在我确实有一个更复杂的用例:我有一个查询,它将 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 对象映射到自定义类型的主要内容,如果未能解决你的问题,请参考以下文章
jOOQ 无法映射 PostgreSQL 列以使 JPA 满意
使用 JOOQ 更新 PostgreSQL 中的 jsonb 值