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

