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

时间:2016-07-08 23:34:29

标签: 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
  }

1 个答案:

答案 0 :(得分:3)

您在错误的位置使用map操作:Query对象上的映射相当于SQL中的SELECT语句。您应该在map调用之后立即执行result操作:

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

由于我们只使用users表中的三列,我们可以通过对map对象使用Query操作来表达。这样底层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)
})