【问题标题】:Scala slick generic modelScala 光滑的通用模型
【发布时间】:2019-08-31 01:21:04
【问题描述】:

我在光滑的抽象表中做了:

abstract class SubResourceTabledef[E, A, I, U](tag: Tag, name: String) extends Table[E](tag, name) {
  val id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  val version = column[Long]("version", O.Default(0L))
  val resource_id = column[Long]("resource_id")

  def * : ProvenShape[E]
  def allMapped: MappedProjection[E, A]

  def insertMapped: MappedProjection[E, I]
  def updateMapped: MappedProjection[E, U]
}

所以稍后我可以基于此创建:

  type EntityType = SomeThingResource
  type AllProjectionTuple = (Option[Long], Option[Long], DateTime, Option[Long], Option[Long], Option[Long], Long)
  type InsertProjectionTuple = (Option[Long], Option[Long], Option[Long], Long)
  type UpdateProjectionTuple = (Long, Option[Long], Option[Long], Option[Long])

  class SomeThingResourceTabledef(tag: Tag) extends SubResourceTabledef[SomeThingResource, AllProjectionTuple, InsertProjectionTuple, UpdateProjectionTuple](tag, tablenameConverter("Table_name")) {
    val a = column[Option[Long]]("a")
    val b = column[Option[Long]]("b")
    val c = column[Option[Long]]("c")

    ...

  }

我可以这样创建 TableQuery:

 object TQDomain extends TableQuery(new ArticleGoodsMovementTabledef(_))

但是我不知道如何将它传递到我的存储库,在那里我进行所有查询:

  class SubResourceCommonRepository[Entity <: SubResource, A, I, U, TableDef <: SubResourceTabledef[Entity, A, I, U]](subResourceTabledef: TableDef)

任何想法如何处理它? 谢谢!

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    通常TableQuery 被创建为TableQuery[SomeThingResourceTabledef], TableQuery[TableDef] ... 这样你就可以写

    TableQuery[SomeThingResourceTabledef].filter(...).map(...)
    

    SELECT ... FROM Table_name WHERE ...

    http://slick.lightbend.com/doc/3.3.1/gettingstarted.html#querying

    但是

    class SubResourceCommonRepository[Entity <: SubResource, A, I, U, TableDef <: SubResourceTabledef[Entity, A, I, U] : ClassTag](subResourceTabledef: TableDef) {
      val query = TableQuery[TableDef]
    }
    

    不会工作。它不能用Error: class type required but TableDef found 编译。问题是TableQuery#apply 使用TableDef 的构造函数实现为macro,在宏扩展时不存在。

    尝试使用overloadedTableQuery#apply(Tag =&gt; E)

    class SubResourceCommonRepository[Entity <: SubResource, A, I, U, TableDef <: SubResourceTabledef[Entity, A, I, U]](subResourceTabledef: Tag /* Added!!! */ => TableDef) {
      val query = TableQuery[TableDef](subResourceTabledef(_))
    }
    
    new SubResourceCommonRepository[SomeThingResource, AllProjectionTuple, InsertProjectionTuple, UpdateProjectionTuple, SomeThingResourceTabledef](new SomeThingResourceTabledef(_))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 2017-01-22
      相关资源
      最近更新 更多