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()
,