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