Slick解除了对象的更新

时间:2013-09-03 15:47:30

标签: database scala sql-update slick

我使用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在内存中进行所有更新,然后对整个对象进行更新。

否则我必须为对象的每个字段运行上面的工作,但是你知道,感觉就像一个肮脏的黑客。

1 个答案:

答案 0 :(得分:3)

而不是q1.update(firstName.getOrElse(q1.list().head)) 你可以写firstName.foreach{ fn => q1.update(fn) } 这是更短,更简单,一个而不是两个查询:)。 当您将foreach视为具有一个或零个元素的集合时,在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) } 会停止看起来很奇怪。

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

Contacts

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

这很干净简单,如果性能不是关键任务,可能是最好的方法,因为这总是会传输{{1}}的所有列。您只需传输选定的列即可节省一些流量。