slick:嵌套(嵌入)类 DRY

标签 slick slick-2.0

如果可以在learning slick2之后定义嵌套类(嵌入在JPA中)像这样:

case class Person(name: Name, address: Address)
case class Name(given: String, family: String)
case class Address(street: String, city: String)

class Directory(tag: Tag) extends Table[Person](tag, "directory") {
  def givenName   = column["String"] ( "given_name" )
  def familyName  = column["String"] ( "family_name" )
  def street      = column["String"] ( "street" )
  def city        = column["String"] ( "city" )

  def * = (name, address) <> (Person.tupled, Person.unapply)
  def name = (givenName, familyName) <> (Name.tupled, Name.unapply)
  def address = (street, city) <> (Address.tupled, Address.unapply)
}

我不想在我嵌入 Adress 的每个表中写入街道、城市和地址的定义。我想编写如下所示的内容,但是由于显而易见的原因,这不会编译,因为列是表等上的方法...是否可以以某种方式重用列定义?

object Adresses {
    def street      = column["String"] ( "street" )
    def city        = column["String"] ( "city" )
    def address = (street, city) <> (Address.tupled, Address.unapply)
}

class Directory(tag: Tag) extends Table[Person](tag, "directory") {
      def givenName   = column["String"] ( "given_name" )
      def familyName  = column["String"] ( "family_name" )


      def * = (name, Adresses.address) <> (Person.tupled, Person.unapply)  //address from Adresses
      def name = (givenName, familyName) <> (Name.tupled, Name.unapply)
}

最佳答案

您可以使 Adresses 成为从 Table 类继承的特征(是的,可行)。

trait Adresses[T] extends Table[T]{
    def street      = column["String"] ( "street" )
    def city        = column["String"] ( "city" )
    def address = (street, city) <> (Address.tupled, Address.unapply)
}

class Directory(tag: Tag) extends Table[Person](tag, "directory") with Adresses[Person] {
      def givenName   = column["String"] ( "given_name" )
      def familyName  = column["String"] ( "family_name" )


      def * = (name, address) <> (Person.tupled, Person.unapply)  //address from Adresses
      def name = (givenName, familyName) <> (Name.tupled, Name.unapply)
}

关于slick:嵌套(嵌入)类 DRY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23759347/

相关文章:

sql - 如何使用 scala slick 3 发送纯 SQL 查询(并检索结果)

scala - Slick - 一对多表模式

scala - 在 scalatest 中创建和删除 scala 光滑表之前和之后的异步

slick-2.0 - 如何将查询结果转换为案例类?

scala - 如何将 AND 添加到连接 SLICK

mysql - Scala Play Framework Slick Session 的问题

scala - 使用 play-slick 1.0 在 play 2.4 中创建表

scala - 在Scala/Slick中,如何重构代码(响应拦截)?

scala - Slick 缺少数据库类吗?

scala - 如何为复杂的案例类创建投影类?