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

问题描述 投票:1回答:1

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

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

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

实现这个的理想方式是什么?

java jooq jsonb
1个回答
0
投票

您显然不能以类型安全的方式执行此操作,因为preferences列的类型将是Field<RegularCustomerPreferences | PremiumCustomerPreferences>(联合类型),并且Java当前不支持联合类型。因此,您可以将常见的CustomerPreferences超类型绑定到列,并在任何消耗的位置向下转换值。

绑定超类型应该相对容易。你将实现一个Binding<Object, CustomerPreferences>,它可以处理RegularCustomerPreferencesPremiumCustomerPreferences值。具体来说,您的转换器看起来像这样:

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不支持读取的多列数据类型绑定基于数据类型转换决策的几个值。这是与https://github.com/jOOQ/jOOQ/issues/6124相关的待处理功能

© www.soinside.com 2019 - 2024. All rights reserved.