JDBI3 обратная версия AbstractArgumentFactory.build

Моя таблица 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(),

0 ответов

Другие вопросы по тегам