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
相关产品推荐
相关产品推荐

