Java 约克公司;PostgreSQL:将从复杂jsonb提取的嵌套json对象映射到自定义类型
我在PostgreSQL数据库中使用JSON对象。堆栈是Java 11、Spring Boot 2+和Spring Boot jooq启动器 我经常将aJava 约克公司;PostgreSQL:将从复杂jsonb提取的嵌套json对象映射到自定义类型,java,json,postgresql,jooq,Java,Json,Postgresql,Jooq,我在PostgreSQL数据库中使用JSON对象。堆栈是Java 11、Spring Boot 2+和Spring Boot jooq启动器 我经常将ajsonb列反序列化为复杂类型,使用利用Jackson的Binding和Converter。到目前为止还不错 现在我有了一个更复杂的用例:我有一个查询,它将json对象的一部分(使用select子句中的jsonb_column::jsonb->>nestedObject操作符)提取到我记录的一个字段中 我想将该记录映射到一个pojo中,这样记录的
jsonb
列反序列化为复杂类型,使用利用Jackson的Binding
和Converter
。到目前为止还不错
现在我有了一个更复杂的用例:我有一个查询,它将json对象的一部分(使用select子句中的jsonb_column::jsonb->>nestedObject
操作符)提取到我记录的一个字段中
我想将该记录映射到一个pojo中,这样记录的所有字段都映射到pojo的字段(使用@Column
注释),并且特定的json嵌套对象应该映射到特定的Java对象
实现这一目标的正确方法是什么
有没有一种方法可以使用绑定和forcedType
(就像我映射完整的jsonb
列一样)来实现这一点
我是否需要借助
记录映射器来实现这一点?实现这一点需要两个部分
1.嵌套对象的数据类型绑定
这可以使用如下代码实现:
DataType<NestedType> myType = SQLDataType.OTHER.asConvertedDataType(new YourBinding());
2.一个普通SQL模板,用于表示嵌套对象的非测试表达式
您无法轻松地向代码生成器提供嵌套对象提取表达式以获取数据,因此必须使用上述数据类型创建一个
Field<NestedType> field = DSL.field("jsonb_column::jsonb ->> nestedObject", myType);
Field-Field=DSL.Field(“jsonb_列::jsonb->>nestedObject”,myType);
现在,您可以在所有查询中使用此字段
表达式
DataType<NestedType> myType = SQLDataType.JSONB.asConvertedDataType(new YourBinding());
class YourBinding implements Binding<JSONB, NestedType> { ... }
Field<NestedType> field = DSL.field("jsonb_column::jsonb ->> nestedObject", myType);