Slick中的自定义列(对象)类型

时间:2018-03-29 15:26:22

标签: scala playframework slick

似乎我无法在任何地方找到如何在Slick中正确使用自定义列类型,而且我已经苦苦挣扎了一段时间。光滑documentation 建议MappedColumnType,但我发现它只能用于简单的用例,如原始类型的包装器(或者可能只是我不知道如何正确使用它)。

假设我在JobsTableDef类描述的数据库中有了Jobs表。在该表中,我有companyIdresponsibleUserId列,它们是各自表格中CompanyUser个对象的外键(CompaniesTableDef,{{1} })。

UsersTableDef

我希望实现的是在class JobsTableDef(tag: Tag) extends Table[Job] (tag, "jobs") { def id = column[Long]("id", O.AutoInc, O.PrimaryKey) def title = column[String]("title") def companyId = column[Long]("companyId") def responsibleUserId = column[Long]("responsibleUserId") def companyFK = foreignKey("COMPANY_ID_FK", companyId, companies)(i => i.id) def responsibleUserFK = foreignKey("RESPONSIBLE_USER_FK", responsibleUserId, users)(i => i.id) val companies = TableQuery[CompaniesTableDef] val users = TableQuery[UsersTableDef] override def * = (id, title, companyId, responsibleUserId) <> (Job.tupled, Job.unapply) } class CompaniesTableDef(tag: Tag) extends Table[Company] (tag, "companies") { def id = column[Long]("id", O.AutoInc, O.PrimaryKey) def name = column[String]("name") def about = column[String]("about") override def * = (id, name, about) <> (Company.tupled, Company.unapply) } class UsersTableDef(tag: Tag) extends Table[User] (tag, "users"){ def id = column[Long]("id", O.AutoInc, O.PrimaryKey) def username = column[String]("username", O.Unique) override def * = (id, username) <> (User.tupled, User.unapply) } 表格中自动“反序列化”CompanyUser代表的ID。例如:

Jobs

鉴于我的class JobsTableDef(tag: Tag) extends Table[Job] (tag, "jobs") { def id = column[Long]("id", O.AutoInc, O.PrimaryKey) def title = column[String]("title") def company = column[Company]("companyId") def responsibleUser = column[User]("responsibleUserId") def companyFK = foreignKey("COMPANY_ID_FK", companyId, companies)(i => i.id.?) def responsibleUserFK = foreignKey("RESPONSIBLE_USER_FK", responsibleUserId, users)(i => i.id.?) val companies = TableQuery[CompaniesTableDef] val users = TableQuery[UsersTableDef] override def * = (id, title, company, responsibleUser) <> (Job.tupled, Job.unapply) } 类定义如下:

Job

目前,我正在以老式的方式从数据库中获取case class Job( id: Long, title: String, company: Company, responsibleUser: User, ) ,阅读JobcompanyId,然后再次查询数据库并手动构建另一个responsibleUserId 1}} object(当然,我也可以连接表,将数据作为Job然后构造tuple对象)。我严重怀疑这是走的路。是否有一种更聪明,更优雅的方式来指示Slick自动从另一个表中获取链接对象?

编辑:我正在使用Play 2.6.12和Slick 3.2.2

1 个答案:

答案 0 :(得分:0)

经过几天深入调查后,我得出结论,目前在Slick中是不可能的。我想要的可以描述为通过自定义列类型描述的自动连接表。 Slick确实支持自定义列类型(通过MappedColumnType体现,如docs中所述),但它仅适用于相对简单的类型,这些类型不是由从DB反序列化的其他对象组成的(至少是自动的,你可以总是尝试从数据库中获取另一个对象,然后Await.result()生成的Future对象,但我想这不是一个好习惯。)

所以,为了回答自己,Slick中的'自动加入'是不可能的,回到手动对象构建的手动连接。