在 Slick 3.x 中选择特定列会引发类型不匹配

ps0*_*604 1 scala slick slick-3.0

在这个 Slick 函数中,我从 User 表中读取并返回一个 SessionUser 对象(SessionUser 的列比 User 少)。

问题是这段代码无法编译,对于 SessionUser 中的每个字段,它都会给我错误type mismatch; found : slick.lifted.Rep[String] required: String。此错误的含义是什么以及如何修复它?

def readByUserid (userid: String) : Option[SessionUser] = {
    val db = Database.forConfig(Constant.dbBank)
    try {
      val users = TableQuery[UserDB]
      val action = users.filter(_.userid === userid)
            .map(u => SessionUser(u.userid, u.firstName, u.lastName)).result

      val future = db.run(action)
      val result = Await.result(future, Duration.Inf)
      result
    } 
     finally db.close
  }
Run Code Online (Sandbox Code Playgroud)

Paw*_*nko 6

map在错误的地方使用了操作:Query对象上的映射相当于SELECTSQL中的语句。您应该mapresult调用之后立即进行操作:

val action = users.filter(_.userid === userid).result.map(_.headOption.map(u => SessionUser(u.userid, u.firstName, u.lastName)))
Run Code Online (Sandbox Code Playgroud)

由于我们只使用users表中的三列,我们可以通过mapQuery对象使用操作来表达这一点。这样底层的 SQL 语句将只选择我们需要的列:

val action = users.filter(_.userid === userid).map(u => (u.userid, u.firstName, u.lastName)).result.map(_.headOption.map { 
  case (userid, firstName, lastName) => SessionUser(userid, firstName, lastName)
})
Run Code Online (Sandbox Code Playgroud)