Scala 将Slick oneToMany结果映射为树格式

Scala 将Slick oneToMany结果映射为树格式,scala,playframework,slick,Scala,Playframework,Slick,我写了一个简单的剧本!2使用光滑的应用程序休息。我有以下域模型: case class Company(id: Option[Long], name: String) case class Department(id: Option[Long], name: String, companyId: Long) class Companies(tag: Tag) extends Table[Company](tag, "COMPANY") { def id = column[Long]

我写了一个简单的剧本!2使用光滑的应用程序休息。我有以下域模型:

case class Company(id: Option[Long], name: String)

case class Department(id: Option[Long], name: String, companyId: Long)


class Companies(tag: Tag) extends Table[Company](tag, "COMPANY") {
    def id = column[Long]("ID", O.AutoInc, O.PrimaryKey)
    def name = column[String]("NAME")

    def * = (id.?, name) <> (Company.tupled, Company.unapply)
}

val companies = TableQuery[Companies]

class Departments(tag: Tag) extends Table[Department](tag, "DEPARTMENT") {
    def id = column[Long]("ID", O.AutoInc, O.PrimaryKey)
    def name = column[String]("NAME")
    def companyId = column[Long]("COMPANY_ID")

    def company = foreignKey("FK_DEPARTMENT_COMPANY", companyId, companies)(_.id)

    def * = (id.?, name, companyId) <> (Department.tupled, Department.unapply)
}

val departments = TableQuery[Departments]
不幸的是,我希望以树状JSON格式显示数据,因此我必须构建一个查询,以获取所有有部门的公司,并以某种方式将其映射到CompanyTo,类似于:

case class CompanyDTO(id: Option[Long], name: String, departments: List[Department])

你知道什么是最好的解决方案吗?我应该使用JSON格式化程序映射列表[(公司、部门)],还是应该将查询更改为使用CompanyTo?如果是这样,我如何将结果映射到CompanyDTO?

据我所知,一对多关系在RDBMS中的一次查询中无法获取。在避免n+1问题的同时,您所能做的最好的事情就是在两个查询中完成它。你的情况是这样的:

用于{
公司携带所有项目)。结果
分组=部门分组依据(u.companyId)
}产量构成图{c=>
val companydps=grouped.getOrElse(c.id.get,Seq()).toList
CompanyDTO(c.id、c.name、companydps)
}
这个查询中有一些固定的部分,您将及时意识到。这使它成为一个很好的抽象对象,您可以重用它来获取一对多的关系

case class CompanyDTO(id: Option[Long], name: String, departments: List[Department])