【发布时间】:2016-07-03 17:25:17
【问题描述】:
我有以下 Scala/Slick/PlayFramework 代码:
class UserRepository @Inject()(dbConfigProvider: DatabaseConfigProvider, loginInfoRepository: LoginInfoRepository) extends BaseRepository[UserTable, User](TableQuery[UserTable], dbConfigProvider.get[JdbcProfile].db) with UserQuery {
val db = dbConfigProvider.get[JdbcProfile].db
def findUserByProviderIdAndKey(providerId: String, providerKey: String): Future[User] = {
for {
maybeLoginInfo <- loginInfoRepository.findByProviderIdAndProviderKey(providerId, providerKey)
maybeUser <- db.run(query.filter(_.loginId === maybeLoginInfo.loginId).result.head) //query refers to the user table with a loginId column
} yield maybeUser
}
查询用户表和登录信息表。用户表在 login_info 表中有一个外键。
目前,findByProviderIdAndProviderKey 方法返回一个Future[LoginInfo]。但是,我想将其更改为为不存在的用户 ID 返回 Future[Option[LoginInfo]]。它可以在findByProviderIdAndProviderKey 方法中轻松更改,但我不确定如何更改理解以处理选项值。
我想我可以像下面这样(需要重构):
class UserRepository @Inject()(dbConfigProvider: DatabaseConfigProvider, loginInfoRepository: LoginInfoRepository) extends BaseRepository[UserTable, User](TableQuery[UserTable], dbConfigProvider.get[JdbcProfile].db) with UserQuery {
val db = dbConfigProvider.get[JdbcProfile].db
def findUserByProviderIdAndKey(providerId: String, providerKey: String): Future[User] = {
loginInfoRepository.findByProviderIdAndProviderKey(providerId, providerKey).map{
case (Some(x)) => db.run(query.fitler(_.loginId == x.loginInd).result.headOption)
case None=> Option(None)
}
现在,我有以下问题:
您将如何处理不返回给定查询值的查询?例如,如果登录信息不存在于表中?我做对了吗?或者,还有更好的方法?
我原以为 slick 会在连接中自动满足
Option值,但似乎没有。为什么没有提升Option值?以上内容会被翻译成两个 SQL 查询和数据库调用吗?如果是,我该如何重新构建它,使其只发出一个正确连接的数据库调用?
提前致谢!
【问题讨论】:
-
既然您的问题是关于您的
findByProviderIdAndProviderKey方法,您能否也发布此代码?