我很习惯编写像这样的标准流畅的样板代码。
假设我正在创建一个名为 Foo 的表,其中包含 id 和 name 列。我们可以这样写
case class Foo(id: Long, name: String)
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") {
def id = column[Long]("id")
def name = column[String]("name")
def * = (id, name) <> (Foo.tupled, Foo.unapply)
}
但是如果我想要一个单列表,其中 Foo 只有一个名称怎么办?下面的代码无法编译,因为 Now Foo 不再具有 tupled 方法。
case class Foo(name: String)
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") {
def name = column[String]("name")
def * = (name) <> (Foo.tupled, Foo.unapply)
}
我在 SO 上找到了这个帖子
Scala projections in Slick for only one column
并将我的代码更改为
case class Foo(name: String)
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") {
def name = column[String]("email_address")
def * = (name)
}
但仍然无法编译
最佳答案
如果是单个参数,请使用Foo.apply _
。您的代码如下所示
case class Foo(name: String)
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") {
def name = column[String]("name")
def * = (name) <> ((Foo.apply _), Foo.unapply)
}
说明:
scala> case class Foo(name: String)
defined class Foo
scala> Foo.apply _
res0: String => Foo = <function1>
如果是单参数案例类 Foo.apply _
返回一个所需的 function1。
但如果有多个参数,这是不可能的,因此需要执行 .tupled
。
关于scala - 使用 Slick 创建单列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41064332/