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