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
相关产品推荐
相关产品推荐

