JOOQ Как конвертировать JSON на основе другого значения столбца? - PullRequest
0 голосов
/ 19 февраля 2019

Допустим, у меня есть таблица customer (int id, тип varchar, предпочтения jsonb) .Тип может быть REGULAR, PREMIUM и т. Д. В зависимости от значения типа столбца структура JSON предпочтений будет другой.

При загрузке записи клиента из базы данных, если type = REGULAR Я хочу преобразовать его в RegularCustomerPreferences тип объекта, а если type = PREMIUM Я хочу преобразовать его в PremiumCustomerPreferences тип объекта.

Я пошелчерез несколько учебных пособий по использованию JOOQ JSON конвертеров / привязок ... но они основаны на взаимно однозначном отображении и не зависят от условий (зависит от значения другого столбца).

Каков идеальный способ реализации этого?

1 Ответ

0 голосов
/ 19 февраля 2019

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

...