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

Scala Slick:使用Case修改列值时类型不匹配如何解决?

Scala Slick:解决Case修改后元组转表对象的类型不匹配问题

问题代码

case class User(name: String, age: Int)

def changeNameQuery(): Query[UserTable, User, Seq] = {
  TableQuery[UserTable].map { user => 
    (Case If (user.name === "A") Then "B" Else "A",
     user.age
    )
  }
}

报错信息

[error] found : slick.lifted.Query[(slick.lifted.Rep[String], slick.lifted.Rep[Int]),(String, Int),Seq]
[error] required: repositories.postgres.PostgresProfile.api.Query[repositories.postgres.UserTable,model.User,Seq]

解决方案

问题根源是map操作返回了元组类型的Query,和方法声明的Query[UserTable, User, Seq]类型不匹配。直接在map里用修改后的字段构造User实例即可,Slick会自动处理case class与表结构的映射。

修改后的代码:

def changeNameQuery(): Query[UserTable, User, Seq] = {
  TableQuery[UserTable].map { user => 
    val updatedName = Case If (user.name === "A") Then "B" Else "A"
    User(updatedName, user.age)
  }
}

如果你的UserTable自定义了投影映射,也可以用shaped配合<>操作符显式转换,但上述方法更简洁——因为User是case class,Slick默认支持它和对应列元组的双向映射,这样返回的Query类型就会完全符合方法声明的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:32:35