【问题标题】:Scala Slick generic table trait move out of DAOScala Slick 通用表特征移出 DAO
【发布时间】:2016-10-13 15:24:03
【问题描述】:

我目前有这个代码:

class UsersRepository @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
  import driver.api._

  private val Users = TableQuery[UsersTable]

  def findByName(name: String): Future[Option[User]] =
    db.run(Users.filter(_.name === name).take(1).result.headOption)

  implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, Timestamp](
    d => Timestamp.from(d.toInstant(ZoneOffset.ofHours(0))),
    d => d.toLocalDateTime
  )

  trait GenericTable {
    this: Table[_] =>
    def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
    def createdAt = column[LocalDateTime]("created_at")
    def updatedAt = column[LocalDateTime]("updated_at")
  }

  private class UsersTable(tag: Tag) extends Table[User](tag, "User") with GenericTable {

    def name = column[String]("name")
    def url = column[String]("url")

    def nameIndex = index("name_index", name, unique = true)

    override def * = (id, createdAt, updatedAt, name, url) <> (User.tupled, User.unapply)
  }

}

我现在如何轻松地将 GenericTable 特征移出 UsersRepository,以便将其与其他表一起使用?如果我只是将其移出,则不再找到 columnTableO 之类的东西,因为我从驱动程序导入中丢失了这些东西。

我还想将 UsersTable 定义本身移出 DAO/repository 类。在这种情况下,我遇到了同样的问题。

谢谢, 马格努斯

【问题讨论】:

    标签: scala playframework slick


    【解决方案1】:

    特征中的提供者dbConfig作为无输入参数def

    trait GenericTableProvider {
      val dbConfig: DatabaseConfig[JdbcProfile]
      import dbConfig.driver.api._
    
      trait GenericTable {
          this: Table[_] =>
    
          def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
          def createdAt = column[LocalDateTime]("created_at")
          def updatedAt = column[LocalDateTime]("updated_at")
        }
    
    }
    

    然后按照下面的代码sn-p所示使用它。

    class UsersRepository @Inject()(protected override val dbConfigProvider: DatabaseConfigProvider) 
      extends HasDatabaseConfigProvider[JdbcProfile] 
      with GenericTableProvider {
    
      import driver.api._
    
      private val Users = TableQuery[UsersTable]
    
      private class UsersTable(tag: Tag) extends Table[User](tag, "User") with GenericTable {
    
        def name = column[String]("name")
        def url = column[String]("url")
    
        def nameIndex = index("name_index", name, unique = true)
    
        override def * = (id, createdAt, updatedAt, name, url) <> (User.tupled, User.unapply)
      }
      .....
    
     }
    

    val dbConfigProvider覆盖def dbConfigProvider

    【讨论】:

    • 不幸的是,这仍然不起作用,因为在this: Table[_] =&gt; 行中找不到符号表。我也无法将导入语句移到此行之前。
    • @Magnus 编辑了答案......有一些修复......请检查..希望这会有所帮助
    • 是的,这有帮助,谢谢!我最终实现了它有点不同。 UsersRepository 扩展 GenericTableProvider(因为我不希望它成为 Table)。但是在UsersRepository 内部,我可以轻松地将GenericTable 特征用于我的实际内部UsersTable 类:)
    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 2021-12-18
    • 1970-01-01
    • 2019-01-28
    • 2019-08-20
    • 2021-04-10
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多