使用Slick创建单个列表

时间:2016-12-09 16:00:03

标签: scala slick slick-3.0

我很习惯这样编写标准的光滑锅炉板代码。

假设我正在创建一个名为Foo的表,其中包含列id和名称。我们可以写

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)
}

但仍然没有编译

3 个答案:

答案 0 :(得分:2)

在单个参数的情况下使用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 _,则返回一个所需的函数。

但是如果有多个参数,则无法进行此操作,因此需要进行.tupled

答案 1 :(得分:2)

我相信以前的答案已经解决了这个特殊问题。不过我觉得有一点值得补充。

Slick中没有任何内容要求您将case classes用作unpacked type unpacked type作为您的模型,在这种情况下{{1 }})。

在您的预测中:

Foo

你可以传递你想要的任何两个函数:

  • 第一个将创建你的def * = (id, name) <> (Foo.tupled, Foo.unapply) 元组(投影中的2 +列)或值(1列投影)

  • 第二个会创建元组(在投影中为2 +列的情况下再次)或
    值(1列投影)。

unpacked type开箱即用(case classestupledapply)生成此类方法非常方便。

我希望这可以澄清,即使你缺乏这样的方法,也总是可能(在最坏的情况下),例如创建满足特定要求的功能。

答案 2 :(得分:0)

还找到了另一个答案

case class Foo(name: String)
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") {
   def name = column[String]("name")
   def * = name <> (Foo, Foo.unapply)
}