使用in子句批量更新

时间:2018-07-01 11:29:40

标签: scala scalikejdbc

是否可以针对sqlite数据库执行具有可变长度的子句内批处理更新?

val data = Seq(
  Seq(Set(1,2,3), 50),
  Seq(Set(4,5,6,7), 51)
)

NamedDB(symbol).localTx { implicit s: DBSession =>
  sql"""
    update table_a
    set xs=(
      select group_concat(x) from (
        select distinct x from table_b where id in (?)
      )
    ) where id=?
  """.batch(xs.map(_.data): _*).apply()
}

此默认方法导致scalikejdbc记录该参数已设置为对象(警告?),结果是未应用任何更新。

我尝试使用参数绑定器,但由于sqlite(及其JDBC驱动程序)不支持数组,因此无法将in (?)参数设置为数组类型。

替代方法是更改​​SQL文本,以使子句中的每个值都具有?。对于批量更新,这是不可能的,因为不同的行具有不同数量的值。

1 个答案:

答案 0 :(得分:0)

我的解决方法是按in子句参数的数量对数据进行分组,并对每个参数执行单独的批处理更新。

xs.map(_.data).groupBy(_.size - 1).foreach { case (length, data) =>
  NamedDB(symbol).localTx { implicit s: DBSession =>
    val inClauseParams = ("?" * length).mkString(",")
    SQL(
      s"""
       update table_a set xs=(
         select group_concat(x) from (
           select distinct x from table_b where id in ($inClauseParams)
         )
       ) where id=?
     """
    ).batch(data: _*).apply()
  }
}