您显然不能以类型安全的方式执行此操作,因为您的preferences
列的类型将是Field<RegularCustomerPreferences | PremiumCustomerPreferences>
(联合类型),并且Java当前不支持联合类型。因此,也许可以将通用的CustomerPreferences
超类型绑定到该列,然后在使用该值的任何地方向下转换该值。
绑定超级类型应该相对容易。您将实现一个Binding<Object, CustomerPreferences>
可同时处理RegularCustomerPreferences
和PremiumCustomerPreferences
值的。具体来说,您的转换器看起来像这样:
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