有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我在PostgreSQL数据库中使用JSON对象。堆栈是Java 11、Spring Boot 2+和Spring Boot jooq启动器

我经常使用利用Jackson的BindingConverter将ajsonb列反序列化为复杂类型。到目前为止还不错

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

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

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

有没有一种方法可以使用绑定和forcedType(就像我映射完整的jsonb列一样)来实现这一点

我是否应该求助于RecordMapper来做那件事


共 (1) 个答案

  1. # 1 楼答案

    您将需要两个部分来实现这一点

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

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

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

    在哪里

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

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

    从jooq3.12(see #7242)开始,将有本机的JSONB支持,使用它您可以更轻松地实现绑定,即

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

    二,。一个普通的SQL模板,用于表示嵌套对象的非测试表达式

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

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

    现在,您可以在所有查询中使用这个field表达式