JDBI3 обратная версия AbstractArgumentFactory.build - PullRequest
0 голосов
/ 20 сентября 2018

Моя таблица MySQL имеет три столбца: один длинный (user_id), другой varchar (имя) и, наконец, varchar (правила (это массив JSON в виде строки)).Я недавно интегрировал JDBI3 и использую его опцию @BindBean.Мой бин (пользовательский класс) выглядит следующим образом.

public class User {
    private long id;
    private String name;
    private List<Rule> rules;
}

, а мой класс правил выглядит следующим образом.

public class Rule {
    private long id;
}

Я также создал AbstractArgumentFactory следующим образом

public class RuleArgumentFactory extends AbstractArgumentFactory<List<Rule>> {

    public RuleArgumentFactory() {
        super(Types.VARCHAR);
    }

    @Override
    protected Argument build(List<Rule> value, ConfigRegistry config) {
        return (position, statement, ctx) -> statement.setString(position, valueToJson());
    }
}

Я наконец-то прикрепил ArgumentFactory для обработки при выполнении запросов к БД.Теперь, когда я выполняю операцию обновления или вставки, как показано ниже, она работает хорошо.

this.jdbi.useHandle(handle -> {
    handle.registerArgument(new RuleArgumentFactory());
    handle.createUpdate(UPDATE_QUERY)
        .bindBean(User)
        .execute();
});

Но проблема в том, что когда я выполняю запрос выбора,

return this.jdbi.withHandle(handle -> {
    handle.registerArgument(new RuleArgumentFactory());
    return handle.createQuery(SELECT_QUERY)
            .bind(param, paramValue)
            .mapToBean(User.class)
            .findFirst();
});

Я не могуполучить объект User потому что, когда JDBI пытается выполнить функцию сборки.Аргументы функции не совпадают, так как они становятся (String, ConfigRegistry), пока она принимает (List<Rule>, ConfigRegistry) и, наконец, выдает ошибку argument type mismatch.Есть ли способ, где я могу сериализовать JSON для объекта List<Rule>.Возможно, что-то противоположное build().

...