【问题标题】:Scala Slick and nested case classesScala Slick 和嵌套案例类
【发布时间】:2018-10-15 17:31:52
【问题描述】:

我是 Scala 的新手,需要使用 slick 为这些案例类构建表映射。

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

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)

我最终需要一个包含所有组合参数的简单表。

【问题讨论】:

    标签: scala slick-3.0


    【解决方案1】:

    鉴于您的嵌套案例类定义,* 投影的双向映射应该可以工作:

    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,您可能会觉得有用。

    【讨论】:

    • 我在尝试编译时遇到错误:错误:(210, 23) 需要稳定标识符,但找到了 Users.this.RiskScore。 { case (username, RiskScore, averageRiskScore, lastSessionId, lastActivityTime, info) => Error:(211, 105) 比可应用于方法 apply 的参数多了一个:(username: String, RiskScore: Float, averageRiskScore: Float, lastSessionId: String, lastActivityTime: Long, info: gailey.org.Info)gailey.org.User in object User User(id, username, RiskScore, averageRiskScore, lastSessionId, lastActivityTime, Info.tupled.apply(info))
    • 并且... 多态表达式无法实例化为预期类型;找到:[R]slick.lifted.MappedProjection[R,(String, Float, Float, String, Long, (Option[String], Option[String], Option[String], Option[String], Option[String], Option[String]))] 必需:slick.lifted.ProvenShape[gailey.org.User]).shape (类型不匹配;发现:slick.lifted.MappedProjection[Nothing,(String, Float, Float, String, Long , (Option[String], Option[String], Option[String], Option[String], Option[String], Option[String]))] 需要:slick.lifted.ProvenShape[gailey.org.User])。形 (
    • @Steve Gailey,我的错,前两个字段之间有一个额外的逗号。答案已修改。
    • 是的,找到多余的逗号并将其删除,但之后出现上述错误。如果我能让它工作,我可以开始弄清楚它是如何工作的,但我什至无法编译:-(不幸的是,错误消息对我来说毫无意义:-(
    • @Steve Gailey,显然编译失败源于 Slick 没有查看 RiskScore 一个有效的字段名称,随后导致参数大小/类型不匹配,......一旦重命名为 @,情况看起来不错987654325@。上面修改后的代码似乎可以正常编译。
    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2013-09-13
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多