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

Selecting specific columns in Slick 3.x throws a type mismatch

在这个 Slick 函数中,我从一个用户 table 和 return 读取了一个 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
  }

您在错误的地方使用了 map 操作:映射到 Query 对象等同于 SQL 中的 SELECT 语句。您应该在 result 调用之后立即放置 map 操作:

val action = users.filter(_.userid === userid).result.map(_.headOption.map(u => SessionUser(u.userid, u.firstName, u.lastName)))

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

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)
})