【问题标题】:jOOQ & PostgreSQL: mapping nested json object extracted from complex jsonb into custom typejOOQ & PostgreSQL:将从复杂 jsonb 中提取的嵌套 json 对象映射到自定义类型
【发布时间】:2019-12-26 10:19:28
【问题描述】:

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

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

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

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

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

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

我应该求助于RecordMapper 吗?

【问题讨论】:

    标签: java json postgresql jooq


    【解决方案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 表达式。

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 1970-01-01
      • 2014-01-09
      • 2020-06-10
      • 2018-10-31
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 2019-07-06
      相关资源
      最近更新 更多