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

时间:2019-07-16 20:47:01

标签: java postgresql jdbi

我正在尝试使用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);

}

我正在使用参数进行编译,这就是为什么我没有显式命名参数的原因(这很好用)。 update使upsert@RegisterBeanMapper方法按预期工作。但是batchUpsert却没有,我得到了:

  

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

有没有一种方法可以将bean作为参数绑定为列表的一部分,而不必编写自定义参数工厂? The docs在这里令人感到沮丧:

  

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

不确定什么“一些其他设置”

1 个答案:

答案 0 :(得分:1)

我从来没有这样使用@BindList(用于批量操作),我也不知道它是否可以与bean一起使用。

the docs说:

  

通过@BindList批注完成绑定值列表。这将以'a,b,c,d,...'形式扩展列表。请注意,与@Bind(使用:binding)

不同,此注释要求您使用表示法。

如果有的话

@BindList List<Long> data

作为界面中的参数,您将不得不使用

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

作为查询(请注意括号而不是冒号)。我怀疑您是否可以将其完全与豆一起使用!