如何在 scala-activerecord 中批量更新

How to mass update in scala-activerecord

我想用单个 SQL 查询更新数据库中的多条记录。有个方法forceUpdate,可以这样用:

case class Document(size: Int, var status: String) extends ActiveRecord
object Document extends ActiveRecordCompanion[Document]

Document.forceUpdate(_.size < 100)(_.status := "small")

但是,它像 beforeSave() 一样绕过了验证和挂钩。我尝试了底层 squeryl:

Document.inTransaction {
  update(Document.table)(d =>
    where(d.size < 100)
    set(d.status := "small")
  )
}

但它也忽略了钩子。

我似乎找不到同时更新多个文档的方法,同时使用挂钩和验证。至少有一些解决方法吗?

当您进行部分更新时,您正在更新一些未知数量的符合您的条件的记录而不检索它们。但是,要触发挂钩,需要知道(即检索)更新的对象。我能想到的最佳替代方法是检索您正在更新的所有对象,然后使用 batch update 而不是部分更新。这不会像您正在执行的部分更新那样快速或高效,但除非您可以在数据库中注册您的挂钩,否则我不知道替代方案是什么。