scala - 使用 Slick 创建单列表

标签 scala slick slick-3.0

我很习惯编写像这样的标准流畅的样板代码。

假设我正在创建一个名为 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/

相关文章:

scala - Cassandra 切片查询不适用于复合键

scala - 如何在 Scala 中对函数进行柯里化(Currying)

mysql jdbc 驱动程序 NumberFormatException

scala - 为什么 Scala 找不到参数 scala.slick.session.Session 的隐式值?

postgresql - 使用 slick 的 3.0.0 流式结果和 Postgresql 的正确方法是什么?

akka - 在 Slick 事务中处理 Akka 流

slick-3.0 - 带有可选列的Slick 3更新

sqlite - 为什么在带有Scala Slick和Joda DateTime的SQLite3上出现SQLITE_ERROR?

sql - slick 3.1 中的多个聚合和子查询

scala - 处理枚举类型的通用映射函数