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

Slick SQL原生查询中如何传递数组参数?

解决Slick 3.3.2原生SQL中传入数组参数的问题

你遇到的SetParameter[Array[Int]]缺失报错,核心原因是标准Slick JDBC驱动并没有内置数组类型的参数绑定支持——你看到的GitHub工单里的可行场景,是基于slick-pg(PostgreSQL专属的Slick扩展库)实现的,而如果用的是原生Slick JDBC,就得手动补全这个绑定逻辑。

下面是具体的解决方法:

1. 自定义数组参数的隐式绑定实现

你需要为Array[Int]编写一个隐式的SetParameter实例,告诉Slick如何把数组参数绑定到SQL查询里。这里以PostgreSQL为例,其他数据库只需调整对应的SQL类型名称:

import slick.jdbc.JdbcBackend
import slick.jdbc.SetParameter

// 为Array[Int]定义隐式参数绑定逻辑
implicit val setArrayInt: SetParameter[Array[Int]] = new SetParameter[Array[Int]] {
  override def apply(v: Array[Int], pp: JdbcBackend.ParameterBinder): Unit = {
    // PostgreSQL的整数数组类型是int4[],MySQL可改为"INT",Oracle改为"NUMBER"
    val sqlArray = pp.connection.createArrayOf("int4", v.map(_.asInstanceOf[AnyRef]))
    pp.setObject(sqlArray)
  }
}

2. 复用原有查询代码

有了这个隐式实现后,你最初的查询代码就能正常执行了:

val ids = Array(1, 2, 3)
val query = sql"""select name from person where id in ($ids)""".as[String]
db.run(query)

可选:直接使用slick-pg简化操作

如果你用的是PostgreSQL,也可以直接引入slick-pg库,它已经为PostgreSQL的数组类型提供了现成的隐式支持,省去自定义的步骤:

// 先添加依赖(版本需与Slick 3.3.2兼容)
// "com.github.tminglei" %% "slick-pg" % "0.20.3"
import com.github.tminglei.slickpg._

// 启用PostgreSQL数组支持
trait MyPostgresProfile extends ExPostgresProfile with PgArraySupport {
  override val api = MyAPI
  object MyAPI extends API with ArrayImplicits
}
object MyPostgresProfile extends MyPostgresProfile

之后导入MyPostgresProfile.api._,就能直接在原生SQL中使用数组参数了。

内容的提问来源于stack exchange,提问作者David Portabella

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:08