You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JDBI将ArrayList存储到PostgreSQL的Integer[]类型字段

解决JDBI将ArrayList存入PostgreSQL Integer[]字段的问题

直接绑定ArrayList到SQL参数会失败,因为JDBI默认不会自动将Java集合转换为PostgreSQL的数组类型。我们需要借助JDBC的java.sql.Array对象或者JDBI的PostgreSQL扩展来实现,下面提供两种可行方案:

方案一:手动创建JDBC Array对象(适用于程序化SQL)

你可以通过JDBI的Handle获取JDBC连接,然后创建对应类型的Array对象来绑定参数:

import java.sql.Array;
import java.util.ArrayList;
import java.util.List;
import org.jdbi.v3.core.Handle;
import org.jdbi.v3.core.mapper.IntegerColumnMapper;

// 示例ArrayList
List<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);

try (Handle handle = JDBI.open()) {
    Integer generatedKey = handle.createStatement("insert into your_table(column_a) values (?)")
        // 创建PostgreSQL integer类型的数组对象
        .bind(0, handle.getConnection().createArrayOf("integer", arrayList.toArray()))
        .executeAndReturnGeneratedKeys(IntegerColumnMapper.PRIMITIVE)
        .first();
}

关键点解释:

  • createArrayOf("integer", arrayList.toArray()):第一个参数是PostgreSQL的类型名(必须是integer,对应数据库的Integer[]字段),第二个参数是Java数组,我们把ArrayList转成数组传入。
  • 用try-with-resources自动管理Handle,避免连接泄漏。

方案二:使用JDBI的@BindArray注解(声明式SQL,更优雅)

如果使用JDBI的声明式DAO模式,推荐用官方的PostgreSQL扩展提供的@BindArray注解,代码更简洁易维护:

步骤1:添加JDBI PostgreSQL扩展依赖

确保你的项目中引入了对应依赖(以Maven为例):

<dependency>
    <groupId>org.jdbi</groupId>
    <artifactId>jdbi3-postgres</artifactId>
    <version>3.37.1</version> <!-- 替换为你当前使用的JDBI版本 -->
</dependency>

步骤2:定义DAO接口

import org.jdbi.v3.sqlobject.customizer.BindArray;
import org.jdbi.v3.sqlobject.statement.GetGeneratedKeys;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
import org.jdbi.v3.core.mapper.IntegerColumnMapper;

public interface YourDao {
    @SqlUpdate("insert into your_table(column_a) values (:ids)")
    @GetGeneratedKeys(columnName = "your_primary_key_column", value = IntegerColumnMapper.PRIMITIVE)
    Integer insertWithIds(@BindArray(columnType = "integer", value = "ids") List<Integer> ids);
}

步骤3:调用DAO方法

List<Integer> arrayList = new ArrayList<>();
arrayList.add(4);
arrayList.add(5);

try (Handle handle = JDBI.open()) {
    YourDao dao = handle.attach(YourDao.class);
    Integer generatedKey = dao.insertWithIds(arrayList);
}

关键点解释:

  • @BindArray(columnType = "integer"):指定PostgreSQL的数组元素类型为integer,JDBI会自动将List<Integer>转换为对应的数据库数组类型。
  • @GetGeneratedKeys:配置返回自增主键,记得替换your_primary_key_column为你表中的实际主键字段名。

注意事项

  • 确认数据库表的column_a字段类型确实是integer[](PostgreSQL中没有int类型,统一用integer)。
  • 如果你的ArrayList包含null元素,PostgreSQL的integer[]会正常存储null值,无需额外处理。

内容的提问来源于stack exchange,提问作者Ashwin Lenekar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:41:25