scala - 自定义映射到 Slick 中的嵌套案例类结构(超过 22 列)

标签 scala slick

我正在尝试将超过 22 列的 DB 行映射到案例类树。
我宁愿不使用 HList,因为我不想使用该 API,也不想使用我在某处读过的一些指数编译时间反馈......

我读过 Stefan Zeiger 回答的这个帖子:How can I handle a > 22 column table with Slick using nested tuples or HLists?

我看过这个测试,它展示了如何定义自定义映射函数,我想这样做:

https://github.com/slick/slick/blob/2.1/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests/JdbcMapperTest.scala#L129-141

def * = (
        id,
        (p1i1, p1i2, p1i3, p1i4, p1i5, p1i6),
        (p2i1, p2i2, p2i3, p2i4, p2i5, p2i6),
        (p3i1, p3i2, p3i3, p3i4, p3i5, p3i6),
        (p4i1, p4i2, p4i3, p4i4, p4i5, p4i6)
      ).shaped <> ({ case (id, p1, p2, p3, p4) =>
        // We could do this without .shaped but then we'd have to write a type annotation for the parameters
        Whole(id, Part.tupled.apply(p1), Part.tupled.apply(p2), Part.tupled.apply(p3), Part.tupled.apply(p4))
      }, { w: Whole =>
        def f(p: Part) = Part.unapply(p).get
        Some((w.id, f(w.p1), f(w.p2), f(w.p3), f(w.p4)))
      })

问题是我做不到!

我试过更小的步骤。
class UserTable(tag: Tag) extends TableWithId[User](tag,"USER") {
  override def id = column[String]("id", O.PrimaryKey)
  def role = column[UserRole.Value]("role", O.NotNull)
  def login = column[String]("login", O.NotNull)
  def password = column[String]("password", O.NotNull)
  def firstName = column[String]("first_name", O.NotNull)
  def lastName = column[String]("last_name", O.NotNull)
  //
  def * = (id, role, login, password, firstName, lastName) <> (User.tupled,User.unapply)
  //
  def login_index = index("idx_user_login", login, unique = true)
}

似乎当我打电话
(id, (firstName, lastName)).shaped

类型是ShapedValue[(Column[String], (Column[String], Column[String])), Nothing]
虽然这个似乎工作正常
(id, firstName, lastName).shaped

U 型参数不是 Nothing但正如预期的那样(String, String, String)
我真的不明白所有 Slick 内部是如何工作的。有人可以解释我为什么我不能让我的代码工作吗?是缺少导入还是什么?

我想我需要得到一个类型的值
ShapedValue[(Column[String], (Column[String], Column[String])), (String, (String, String))]

但我不知道为什么它返回给我 Nothing并不太明白这些隐含的Shape 在哪里参数来自...

我想要的只是能够轻松地将我的专栏分成 2 个案例类

谢谢

最佳答案

另外,22 列限制也有同样的问题,test case非常有帮助。不知道为什么示例代码对你不起作用,下面的代码对我来说很好用,

case class UserRole(var role: String, var extra: String)
case class UserInfo(var login: String, var password: String, var firstName: String, var lastName: String)

case class User(id: Option[String], var info: UserInfo, var role: UserRole)

class UserTable(tag: Tag) extends Table[User](tag, "USER") {

  def id = column[String]("id", O.PrimaryKey)
  def role = column[String]("role", O.NotNull)
  def extra = column[String]("extra", O.NotNull)
  def login = column[String]("login", O.NotNull)
  def password = column[String]("password", O.NotNull)
  def firstName = column[String]("first_name", O.NotNull)
  def lastName = column[String]("last_name", O.NotNull)

  /** Projection */
  def * = (
    id,
    (login, password, firstName, lastName),
    (role, extra)
  ).shaped <> (

  { case (id, userInfo, userRole) =>
    User(Option[id], UserInfo.tupled.apply(userInfo), UserRole.tupled.apply(userRole))
  },
  { u: User =>
      def f1(p: UserInfo) = UserInfo.unapply(p).get
      def f2(p: UserRole) = UserRole.unapply(p).get
      Some((u.id.get, f1(u.info), f2(u.role)))
  })

  def login_index = index("id_user_login", login, unique = true)
}

关于scala - 自定义映射到 Slick 中的嵌套案例类结构(超过 22 列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28305023/

相关文章:

scala - 隐式类有命名约定吗?

scalaz:如何处理验证中的不同错误类型?

scala - 如何通过 SQLException : Attempting to obtain a connection from a pool that has already been shutdown

Scala - 数组上的模式匹配不会对丢失的情况发出警告

scala - 我应该默认使用 GenSeq 吗?

scala - 光滑的多个连接

scala - 光滑 2.0 : How to convert lifted query results to a case class?

sql - 使用新的外键 ID 复制数据的方法

scala - Slick 3.1-将列的子集作为案例类检索

斯卡拉动力学 : Ability to add dynamic methods?