Пакетное обновление с в пункте - PullRequest
0 голосов
/ 01 июля 2018

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

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

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

1 Ответ

0 голосов
/ 01 июля 2018

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

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()
  }
}
...