加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – SLICK如何定义双向一对多关系以用于案例类

发布时间:2020-12-16 09:20:34 所属栏目:安全 来源:网络整理
导读:我正在使用SLICK 1.0.0-RC2.我已经定义了以下两个表Directorate和ServiceArea,其中Directorate与ServiceArea有一对多的关系 case class Directorate(dirCode: String,name: String)object Directorates extends Table[Directorate]("DIRECTORATES") { def di
我正在使用SLICK 1.0.0-RC2.我已经定义了以下两个表Directorate和ServiceArea,其中Directorate与ServiceArea有一对多的关系

case class Directorate(dirCode: String,name: String)

object Directorates extends Table[Directorate]("DIRECTORATES") {

  def dirCode = column[String]("DIRECTORATE_CODE",O.PrimaryKey)

  def name = column[String]("NAME")

  def * = dirCode ~ name  <> (Directorate,Directorate.unapply _) 
}

case class ServiceArea(areaCode: String,dirCode: String,name: String)

object ServiceAreas extends Table[ServiceArea]("SERVICE_AREAS") {

  def areaCode = column[String]("AREAE_CODE",O.PrimaryKey)

  def dirCode = column[String]("DIRECTORATE_CODE")

  def name = column[String]("NAME")

  def directorate = foreignKey("DIR_FK",dirCode,Directorates)(_.dirCode)

  def * = areaCode ~ dirCode ~ name <> (ServiceArea,ServiceArea.unapply _)
}

为使Director Director案例类在我的Play应用程序表中有用,我试图重新定义Directorate案例类,以具有与该Director相关的ServiceAreas的Seq.

case class Directorate(dirCode: String,name: String,serviceAreas: Seq[ServiceArea])

我的问题现在是与董事会表的投影.我试图在总监中创建一个方法:

def serviceAreas = (for { a <- ServiceAreas
                         if (a.dirCode === dirCode)
                    } yield (a)).list map {
                      case t: ServiceArea => t
                    }

所以我可以尝试像

def * = dirCode ~ name  ~ serviceAreas <> (Directorate,Directorate.unapply _)

但是这样做不能像serviceAreas一样.

对我来说,对于Directorate案例类是一个有用的域对象,它应该能够包含相关的ServiceAreas,这似乎是合理的.

我想知道我应该如何遍历反向关系,以便Directorate表投影工作.

解决方法

我确定有一个更优雅的解决方案,但这应该是诀窍:

import scala.slick.driver.H2Driver.simple._
import Database.threadLocalSession

object SlickExperiments2 {

  Database.forURL("jdbc:h2:mem:test1",driver = "org.h2.Driver") withSession {

    (Directorates.ddl ++ ServiceAreas.ddl).create

    case class Directorate(dirCode: String,name: String) {
      def serviceAreas: Seq[ServiceArea] = (for {
        a <- ServiceAreas
        if (a.dirCode === dirCode)
      } yield (a)).list
    }

    object Directorates extends Table[Directorate]("DIRECTORATES") {

      def dirCode = column[String]("DIRECTORATE_CODE",O.PrimaryKey)

      def name = column[String]("NAME")

      def * = dirCode ~ name <> (Directorate,Directorate.unapply _)
    }

    case class ServiceArea(areaCode: String,name: String)

    object ServiceAreas extends Table[ServiceArea]("SERVICE_AREAS") {

      def areaCode = column[String]("AREAE_CODE",O.PrimaryKey)

      def dirCode = column[String]("DIRECTORATE_CODE")

      def name = column[String]("NAME")

      def directorate = foreignKey("DIR_FK",Directorates)(_.dirCode)

      def * = areaCode ~ dirCode ~ name <> (ServiceArea,ServiceArea.unapply _)
    }

    Directorates.insert(Directorate("Dircode","Dirname"))

    ServiceAreas.insertAll(ServiceArea("a","Dircode","A"),ServiceArea("b","B"))

    val sa = (for{
    d <- Directorates
    } yield d).list map { case t: Directorate => t.serviceAreas}

    println(sa)
  }                                              
 //> List(List(ServiceArea(a,Dircode,A),ServiceArea(b,B)))
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读