0

我使用 Slick 对提升的实体进行更新。此代码更新 Contact 对象的 firstName:

def updateContact(id: Int, firstName: Option[String]): Unit = {
  val q1 = for {
    c <- Contacts
    if c.id is id
  } yield c.firstName
  // Update value with same or new value
  q1.update(firstName.getOrElse(q1.list().head))
}

此处的选项对于更新值已经很有用,以防它是 Some (尽管如果仅在有新值时才进行更新会更好)。

我正在寻找的是一种通过 ID 查询对象的方法,然后使用 getOrElse 在内存中进行所有更新,然后对整个对象进行更新。

否则,我必须为有效的对象的每个字段运行上述内容,但你知道,感觉就像一个肮脏的黑客。

4

1 回答 1

3

而不是q1.update(firstName.getOrElse(q1.list().head)) 您可以编写firstName.foreach{ fn => q1.update(fn) } 更短、更简单的一个而不是两个查询:)。当您将 on 视为具有一个或零个元素的集合时,使用foreachon不再看起来很奇怪。Option

关于您获取整个对象,修改它并将其保存回来的想法,您可以这样做:

def updateContact(id: Int, firstName: Option[String], lastName:Option[String], ...): Unit = {
  val q1 = Query(Contacts).filter(_.id === id)
  val c = q1.first
  val modifiedC = c.copy(
    firstName = firstName.getOrElse(c.firstName),
    lastName = lastName.getOrElse(c.lastName),
    ...
  )
  q1.update(modifiedC)
}

这是另一个例子:http ://sysgears.com/notes/how-to-update-entire-database-record-using-slick/

这是干净和简单的,如果性能不是关键任务,这可能是最好的方法,因为这总是传输Contacts. 您可以通过仅传输选定的列来节省一些流量。

于 2013-09-05T11:54:34.420 回答