使用Slick Lifted Embedding如何更新多列?

49

使用Slick Lifted Embedding如何更新多列?这份文档没有提供太多信息。

我期望它应该是类似下面这样的:

Query(AbilitiesTable).filter((ab: AbilitiesTable.type) => ab.id === ability_id).map((ab: AbilitiesTable.type) => (ab.verb, ab.subject)).update("edit", "doc")
2个回答

78

在最近版本的Slick中,这种写法可以工作:

Users.filter(_.id === filterId)
     .map(x => (x.name, x.age))
     .update(("john", 99))

如果您更新多个属性,请小心记住添加额外的括号,否则可能会收到编译器警告。


3
在IntelliJ中逗号可能无法正常工作。你可以使用另一种写法来代替,就像这样:(x.name ~ x.age)。 - Rajeev
2
在Intellij 2016版本中,逗号似乎运行正常。 - null
1
.map(x => (...))update(("x", "y")) 中不要忘记元组,因此需要双括号。 - kosiara - Bartosz Kosarzycki

75

我想通了,应该是这样的。

val map = Query(AbilitiesTable)
  .filter(_.id === ability_id)
  .map(ab => ab.verb ~ ab.context)

map.update(("", ""))

Typesafe,为什么你们的文档如此糟糕?我必须要在谷歌上花费很多时间查询一些无聊的小事情或是挖掘数小时的单元测试。请改进一下吧。谢谢。


10
请注意,这仅适用于可更新的结果集,需要包括ID。如果在构建查询时不包括ID字段尝试使用此方法,它将失败。 - BeepDog
抱歉...但是AbilitiesTable是什么?这是指TableQuery对象吗?类似这样的类:class CompanyTable(tag: Tag) extends Table[Company] - windweller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接