java - JOOQ 如何根据其他列值转换JSON?

标签 java jooq jsonb

假设我有一个表customer(int id,type varchar,preferences jsonb)类型可以是REGULARPREMIUM等。根据列类型值,首选项JSON结构将有所不同。

从数据库加载客户记录时,如果type=REGULAR我想将其转换为RegularCustomerPreferences对象类型,如果type=PREMIUM我想将其转换为PremiumCustomerPreferences对象类型。

我已经阅读了一些关于使用 JOOQ JSON 转换器/绑定(bind)的教程..但它们是一对一的映射,而不是基于条件的(取决于另一个列值)。

实现这一点的理想方法是什么?

最佳答案

您显然不能以类型安全的方式执行此操作,因为 preferences 的类型列将是 Field<RegularCustomerPreferences | PremiumCustomerPreferences> (联合类型),Java 目前不支持联合类型。因此,您可以绑定(bind)一个公共(public) CustomerPreferences也许可以对列进行 super 类型,并在使用该值的任何地方向下转换该值。

绑定(bind)父类(super class)型应该相对容易。您将实现 Binding<Object, CustomerPreferences> ,它可以处理 RegularCustomerPreferencesPremiumCustomerPreferences值(value)观。具体来说,您的转换器将如下所示:

public Converter<Object, CustomerPreferences> converter() {
    return new Converter<Object, CustomerPreferences>() {
        @Override
        public CustomerPreferences from(Object t) {
            if (some check here to see if this is a regular customer)
                return new RegularCustomerPreferences(t);
            else
                return new PremiumCustomerPreferences(t);
        }

        @Override
        public Object to(CustomerPreferences u) {
            return MyJSONTools.toJSON(u);
        }

        @Override
        public Class<Object> fromType() {
            return Object.class;
        }

        @Override
        public Class<CustomerPreferences> toType() {
            return CustomerPreferences.class;
        }
    };
}

这里的假设是您的 JSON 内容允许决定 JSON 文档应该具有什么类型,与 type 冗余。列,因为目前从版本 3.11 和 3.12 开始,jOOQ 不支持多列数据类型绑定(bind),该绑定(bind)读取多个值以作为数据类型转换决策的基础。这是与以下相关的待定功能:https://github.com/jOOQ/jOOQ/issues/6124

关于java - JOOQ 如何根据其他列值转换JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54763138/

相关文章:

postgresql - Postgres jsonb null vs 空对象查询性能

sql - 用另一个 json 对象更新 json 列 postgres9.5

java - 如何使用 JOOQ 获得简单的 Sum?

java - JOOQ:一次性删除记录列表?

java - 如何使用 String.split 提取方括号之间的文本

java - 删除/替换独生子后 JTree.expandPath 的奇怪问题

java - JOOQ - 列 "id"是 uuid 类型,但表达式是字符类型变化

arrays - JSON 数组列转换为 JSON 对象

java - Bean 验证不起作用?

java - Zip4j:如果创建的 zip 文件存在,如何覆盖