我的MySQL表看起来有三列,一个是long(user_id),另一个是varchar(名称),最后是varchar(规则(这是一个作为字符串的JSON数组))。我最近集成了JDBI3,并且正在使用其this
选项。我的bean(用户类)如下所示。
@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();
});
对象,因为当JDBI尝试执行构建功能时。函数的参数变得不匹配,因为它们在接受User
时变成(String, ConfigRegistry)
,最后抛出了错误(List<Rule>, ConfigRegistry)
。有没有一种方法可以将JSON序列化为argument type mismatch
对象。可能与List<Rule>
相反。