似乎我无法在任何地方找到如何在Slick中正确使用自定义列类型,而且我已经苦苦挣扎了一段时间。光滑documentation
建议MappedColumnType
,但我发现它只能用于简单的用例,如原始类型的包装器(或者可能只是我不知道如何正确使用它)。
假设我在JobsTableDef
类描述的数据库中有了Jobs表。在该表中,我有companyId
和responsibleUserId
列,它们是各自表格中Company
和User
个对象的外键(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)
}
表格中自动“反序列化”Company
和User
代表的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,
)
,阅读Job
和companyId
,然后再次查询数据库并手动构建另一个responsibleUserId
1}} object(当然,我也可以连接表,将数据作为Job
然后构造tuple
对象)。我严重怀疑这是走的路。是否有一种更聪明,更优雅的方式来指示Slick自动从另一个表中获取链接对象?
编辑:我正在使用Play 2.6.12和Slick 3.2.2
答案 0 :(得分:0)
经过几天深入调查后,我得出结论,目前在Slick中是不可能的。我想要的可以描述为通过自定义列类型描述的自动连接表。 Slick确实支持自定义列类型(通过MappedColumnType
体现,如docs中所述),但它仅适用于相对简单的类型,这些类型不是由从DB反序列化的其他对象组成的(至少是自动的,你可以总是尝试从数据库中获取另一个对象,然后Await.result()
生成的Future
对象,但我想这不是一个好习惯。)
所以,为了回答自己,Slick中的'自动加入'是不可能的,回到手动对象构建的手动连接。