Scala Slick和嵌套案例类

时间:2018-10-14 15:41:42

标签: scala slick-3.0

我对Scala还是很陌生,需要使用slick为这些case类构建表映射。

我可以为一个简单的案例类做这件事,但是嵌套和选项参数让我很困惑如何做?

case class Info(fullName: Option[String], dn: Option[String], manager: Option[String], title: Option[String], group: Option[String], sid: Option[String])

case class User(username: String, RiskScore: Float, averageRiskScore: Float, lastSessionId: String, lastActivityTime: Long, info: Info)

我最后需要一个简单的表,其中包含所有组合的参数。

1 个答案:

答案 0 :(得分:2)

鉴于您嵌套的案例类定义,*投影的双向映射应类似于以下内容:

case class Info(fullName: Option[String], dn: Option[String], manager: Option[String], title: Option[String], group: Option[String], sid: Option[String])

case class User(username: String, riskScore: Float, averageRiskScore: Float, lastSessionId: String, lastActivityTime: Long, info: Info)

class Users(tag: Tag) extends Table[User](tag, "USERS") {

  def username = column[String]("user_name")
  def riskScore = column[Float]("risk_score")
  def averageRiskScore = column[Float]("average_risk_score")
  def lastSessionId = column[String]("last_session_id")
  def lastActivityTime = column[Long]("last_acitivity_time")

  def fullName = column[Option[String]]("full_name", O.Default(None))
  def dn = column[Option[String]]("dn", O.Default(None))
  def manager = column[Option[String]]("manager", O.Default(None))
  def title = column[Option[String]]("title", O.Default(None))
  def group = column[Option[String]]("group", O.Default(None))
  def sid = column[Option[String]]("sid", O.Default(None))

  def * = (
      username, riskScore, averageRiskScore, lastSessionId, lastActivityTime, (
        fullName, dn, manager, title, group, sid
      )
    ).shaped <> (
      { case (username, riskScore, averageRiskScore, lastSessionId, lastActivityTime, info) =>
          User(username, riskScore, averageRiskScore, lastSessionId, lastActivityTime, Info.tupled.apply(info))
      },
      { u: User =>
          def f(i: Info) = Info.unapply(i).get
          Some((u.username, u.riskScore, u.averageRiskScore, u.lastSessionId, u.lastActivityTime, f(u.info)))
      }
    )
}

在这里您可能会发现很有用的Slick article

相关问题