我使用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在内存中进行所有更新,然后对整个对象进行更新。
否则我必须为对象的每个字段运行上面的工作,但是你知道,感觉就像一个肮脏的黑客。
答案 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}}的所有列。您只需传输选定的列即可节省一些流量。