jdbi3 abstractargumentfactory.build的反面

sq1bmfud  于 2021-06-19  发布在  Mysql
关注(0)|答案(0)|浏览(141)

我的mysql表看起来有三列,一列是long(userid),另一列是varchar(name),最后是varchar(rules(这是一个json数组作为string))。我最近集成了jdbi3,我正在使用它的 @BindBean 选项。我的bean(用户类)如下所示。

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();
});

但问题是当我执行select查询时,

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

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题