如何在 JDBI 3 中使用列表绑定 Bean 参数



我正在尝试使用 SqlObject API 在 Postgres 中存储 Bean POJO 列表。 我的界面看起来像这样:

@UseClasspathSqlLocator
@RegisterBeanMapper(SomeBean.class)
public interface LeadStateDao {
    @SqlUpdate
    @GetGeneratedKeys
    SomeBean update(@BindBean SomeBean bean);
    @SqlUpdate
    @GetGeneratedKeys
    SomeBean upsert(@BindBean SomeBean bean);
    @SqlUpdate
    @GetGeneratedKeys
    int[] batchUpsert(@BindList List<SomeBean> beans);
}

我正在使用参数进行编译,这就是为什么我没有明确命名参数的原因(这工作正常(。 由于@RegisterBeanMapperupdateupsert方法按预期工作。 但是batchUpsert没有,我得到:

java.lang.UnsupportedOperationException: 没有为类型类 com.foo.SomeBean 的"com.foo.SomeBean@49d11f58"注册参数工厂

有没有办法将 Bean 绑定为参数,作为列表的一部分,而无需编写自定义参数工厂? 令人沮丧的是,文档在这里含糊不清:

java.util.Collection 和 Java 数组(存储为 SQL 数组(。根据数组元素的类型,可能需要一些额外的设置。

不确定"一些额外的设置">需要什么。

我从来没有使用过这样的@BindList(用于批量操作(,我不知道它是否适合与豆子一起使用。

正如文档所说:

绑定值列表是通过@BindList注释完成的。这将在"a,b,c,d"中扩展列表,...'的形式。请注意,此注释要求您使用 表示法,这与 @Bind 不同(使用 :binding(

所以如果你有

@BindList List<Long> data

作为界面中的参数,您必须使用

select * from my_data where id in (<data>)

作为查询(注意括号而不是冒号(。我怀疑你根本不能把它和豆子一起使用!

最新更新