2017-06-16 4 views
0

私は簡単なPlayを書いています! 2 SlickアプリケーションでREST。私は、次のしているドメインモデル:ここ地図Slick oneToManyの結果はツリー形式

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] 

とは、すべての関連部門と、すべての企業を照会するための私の方法です:

override def findAll: Future[List[(Company, Department)]] = { 
    db.run((companies join departments on (_.id === _.companyId)).to[List].result) 
} 

Unfortuneatelly私は木JSON形式のデータを表示したいので、私は構築する必要があります

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

は、あなたがこのための最善の解決策は何か知っています:部門とすべての企業を取得し、CompanyDTOに何とかそのようなものを、それらをマッピングしたクエリ? List [(Company、Department)]をJSONフォーマッタでマッピングするか、CompanyDTOを使用するようにクエリを変更する必要がありますか?もしそうなら、どうすれば結果をCompanyDTOにマッピングできますか?

答えて

0

私の知る限りでは、1対多の関係はRDBMSの1つのクエリで取得されることは知られていません。 n + 1の問題を回避しながらできることは、2つのクエリでそれを行うことです。

このクエリには、時間の経過とともに実現する固定部分がいくつかあります。これは、抽象化のための良い候補になります。一般的に滑らかな形で1対多の関係をフェッチするために再利用できるものです。

関連する問題