我正在尝试使Slick证明工作正常,但是从此行中出现Type Mismatch错误:
def * : MappedProjection[Nothing, (Option[Int], String)] = (id.?, name) <> (User.tupled, User.unapply)
具体来说,User.tupled
和User.unapply
分别具有以下错误:
Type mismatch, expected: Option[(Option[Int], String)] => NotInferedR, actual: Option[(Option[Int], String)] => User
和
Type mismatch, expected: NotInferedR => Option[(Option[Int], String)], actual: User => option[(Option[Int], String)]
我不知道为什么编译器认为应该是NotInferedR
;我找不到与此相关的任何文档,并且多本教程似乎都认为足够了。
这是我的package.scala
文件:
package nford
import slick.basic.DatabaseConfig
import slick.jdbc.JdbcProfile
package object domain {
trait DatabaseBacking {
val config: DatabaseConfig[JdbcProfile]
val db: JdbcProfile#Backend#Database = config.db
}
}
这是我的User.scala
文件:
package nford.domain
import nford.domain
import slick.basic.DatabaseConfig
import slick.dbio.DBIOAction
import slick.jdbc.JdbcProfile
import slick.lifted.{Index, MappedProjection}
import scala.concurrent.Future
case class User(id: Option[Int], name: Option[String])
trait UserTable {
this: DatabaseBacking =>
import config.profile.api._
private class User(tag: Tag) extends Table[User](tag, "user") {
def id: Rep[Int] = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name: Rep[String] = column[String]("name")
def * : MappedProjection[Nothing, (Option[Int], String)] = (id.?, name) <> (User.tupled, User.unapply)
}
val user = TableQuery[User]
}
如何解决这种不匹配?
答案 0 :(得分:1)
最新答案,但我遇到了同样的问题,却发现了这个未答复的帖子。不幸的是,我无法弄清为什么为什么不起作用。我已经看到一些示例,就像您所做的那样编写,但是也许这些示例使用的是2.12之前的Scala版本?无论如何,我发现使用mapTo
对我有效。因此,在您的情况下,它将是:
def * : ProvenShape[User] = (id.?, name.?).mapTo[User]
(我认为名称也需要.?
,因为name
是User类中的Option[String]
,并且name
列定义为String
)