Пакетное обновление с пунктом in

Можно ли выполнить пакетное обновление с пунктом переменной длины в отношении sqlite db?

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 регистрировать, что параметр устанавливается как объект (предупреждение?), и в результате обновления не применяются.

Я попытался использовать связыватель параметров, но невозможно установить параметр in (?) в качестве типа массива, поскольку sqlite (и его драйвер JDBC) не поддерживают массивы.

Альтернативой является изменение текста SQL так, чтобы в предложении было ? на значение. Это невозможно при пакетном обновлении, так как разные строки содержат разное количество значений.


person Synesso    schedule 01.07.2018    source источник


Ответы (1)


Мой обходной путь состоит в том, чтобы сгруппировать данные по количеству параметров в предложении и выполнить отдельное пакетное обновление для каждого.

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()
  }
}
person Synesso    schedule 01.07.2018