在这个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
}
答案 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)
})