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))) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |