Очевидно, что вы не можете сделать это безопасным для типов способом, поскольку тип столбца 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