Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 第一个选项显示slick 3.0和play 2.4中的错误_Scala_Playframework_Slick_Securesocial - Fatal编程技术网

Scala 第一个选项显示slick 3.0和play 2.4中的错误

Scala 第一个选项显示slick 3.0和play 2.4中的错误,scala,playframework,slick,securesocial,Scala,Playframework,Slick,Securesocial,我在我的项目中集成了securesocial的一个分支,作为一个身份验证库,所以我使用slick play Screet slick seed来跟踪它的示例项目 在编写eclipse时,我遇到了很多错误 def find(loginInfo: LoginInfo) = { DB withSession { implicit session => Future.successful { slickLoginInfos.filter( x => x

我在我的项目中集成了securesocial的一个分支,作为一个身份验证库,所以我使用slick play Screet slick seed来跟踪它的示例项目

在编写eclipse时,我遇到了很多错误

def find(loginInfo: LoginInfo) = {
  DB withSession { implicit session =>
    Future.successful {
      slickLoginInfos.filter(
        x => x.providerID === loginInfo.providerID && x.providerKey === loginInfo.providerKey
      ).firstOption match {
        case Some(info) =>
          slickUserLoginInfos.filter(_.loginInfoId === info.id).firstOption match {
            case Some(userLoginInfo) =>
              slickUsers.filter(_.id === userLoginInfo.userID).firstOption match {
                case Some(user) =>
                  Some(User(UUID.fromString(user.userID), loginInfo, user.firstName, user.lastName, user.fullName, user.email, user.avatarURL))
                case None => None
              }
            case None => None
          }
        case None => None
      }
    }
  }
}
[由于示例项目是使用play和slick的旧版本编写的,因此可能会出现错误]

我试图迁移它们,所以我用run替换了session,用headOption替换了firstOption,因为我在slick官方文档中读到,以前的版本在slick 3.0中已经被弃用了。以下是我的更改,但仍然不起作用

def find(loginInfo: LoginInfo) = {
   DB run { 
     Future.successful {
        slickLoginInfos.filter(
          x => x.providerID === loginInfo.providerID && x.providerKey === loginInfo.providerKey
        ).result.headOption match {
          case Some(info) =>
            slickUserLoginInfos.filter(_.loginInfoId === info.id).result.headOption match {
              case Some(userLoginInfo) =>
                slickUsers.filter(_.id === userLoginInfo.userID).result.headOption match {
                  case Some(user) =>
                    Some(User(UUID.fromString(user.userID), loginInfo, user.firstName, user.lastName, user.fullName, user.email, user.avatarURL))
                  case None => None
                }
              case None => None
            }
          case None => None
        }
     }
  }
}
我是个新手,每天都在探索新事物。你能帮我解决这些错误吗。如果有人也能向我解释一下未来值的用法,以及使用wait db.run…得到的值比正常值有多大的好处,那将是很有价值的。。。。如何解析future对象中的值,因为我在一些地方见过他们使用map,在一些地方见过他们使用onSuccess或case,这非常令人困惑。处理未来值的最佳方法是什么?

查找joinLeft,如果没有匹配项,将使用右joinRight选项。所以,你会想要这样的东西:

val q1 = for {
  (loginInfo, userLoginInfo) <- slickLoginInfos.filter(...) joinLeft slickUserLoginInfos on (_.id === _.loginInfoId)
} yield (loginInfo, userLoginInfo)
val q2 = for {
  ((loginInfo, userLoginInfo), user) <- q1 joinLeft slickUsers.filter(...) on (_._2.loginInfoId === _.id)
} yield {
   // use loginInfo, userLoginInfo and user are optional
}
dao.fetch().map(_.toString)
其中dao.fetch返回一个Seq[Int]。现在,使用Slick 3.0,这将是未来的[Seq[Int]],这意味着您只需要另一个。map或flatMap:


它继续做着和以前一样的事情,只是它现在被包装在未来。使用Futures的好处在于,您不需要为每次对数据库的调用都阻止线程。

我们不能不使用联接吗?同样在查询q2中,我有点不清楚在slickUsers.filter中要写什么。在这种情况下,您需要每次运行db.run。结果不会这样做,除非您加入。这样做的缺点是,您需要进行三次单独的DB调用,而使用join只需要进行一次DB调用。谢谢,我知道这样做会很慢。但是你能帮我完成第二个问题吗。我只是被困在这里,因为u2是一种我无法应用===运算符的选项。我在学斯里克,但我对它知之甚少。
dao.fetch().map(_.map(_.toString))