You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Slick更新查询中如何同时修改多个字段?

Slick多字段更新的正确写法

当然可以同时更新多个字段,你之前的写法问题出在map方法的语法上,不能直接用(_.name, _.year)这种形式,需要明确构建字段投影。以下是两种可行的写法:

1. 元组投影写法

这是最直接的方式,通过map返回包含要更新字段的元组,然后update时传入对应值的元组:

val updateMovieQuery = SlickTables.movieTable
  .filter(_.id === movieId)
  .map(m => (m.name, m.year)) // 构建包含name和year的元组投影
  .update(("newName", 1997)) // 传入对应字段的新值元组

2. 自定义表投影写法

如果你的表定义了自定义投影(比如对应case class的部分字段),可以直接复用这个投影来更新:
首先在表定义中添加对应投影:

class MovieTable(tag: Tag) extends Table[Movie](tag, "movies") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def year = column[Int]("year")
  // 完整case class投影
  override def * = (id, name, year) <> (Movie.tupled, Movie.unapply)
  // 自定义仅包含name和year的投影
  def nameYearProjection = (name, year)
}

然后更新时使用这个投影:

val updateMovieQuery = SlickTables.movieTable
  .filter(_.id === movieId)
  .map(_.nameYearProjection)
  .update(("newName", 1997))

为什么你的原写法无法运行?

Slick的map方法需要接收一个明确的函数来生成可更新的字段投影,_.name, _.year这种写法不符合Scala的语法规范,必须用m => (m.name, m.year)这样的lambda表达式来构建元组投影,才能被Slick正确解析。

内容的提问来源于stack exchange,提问作者heuristic123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:06:51