【问题标题】:Scala Slick single filter for multiple TableQuery instances用于多个 TableQuery 实例的 Scala Slick 单个过滤器
【发布时间】:2016-01-12 22:25:43
【问题描述】:

我正在使用 Scala Slick-3.1.0 库

如何制作一个通用的 Slick 过滤器函数,将 TableQuery 实例作为输入并对其进行相同的 slick 过滤器?

我有几个案例类(例如两个)代表存储在 DB 中的数据。 有些字段是相同的,因此类可能会扩展共同的祖先:

case class FirstData(symbol: String,
                     date: Timestamp,
                     firstField: Double) 

case class SecondData(symbol: String,
                      date: Timestamp,
                      secondField: String) 

它们每个在 DB 中都有自己的 SQL 表,并由单独的 Slick Table 类表示。他们也有相同的主键:

class FirstDataTable(tag: Tag) extends Table[FirstData](tag, "firstData") {
    def symbol = column[String]("symbol")
    def date = column[Timestamp]("date")
    def firstField= column[Double]("firstField")
    def * = (symbol, date, firstField) <> ((FirstData.apply _).tupled, FirstData.unapply)
    def pk = primaryKey("pk_firstData", (symbol, date))
}

class SecondDataTable(tag: Tag) extends Table[SecondData](tag, "secondData"){
    def symbol = column[String]("symbol")
    def date = column[Timestamp]("date")
    def secondField= column[String]("secondField")
    def * = (symbol, date, secondField) <> ((SecondData.apply _).tupled, SecondData.unapply)
    def pk = primaryKey("pk_secondData", (symbol, date))
}

最后TableQuery类是:

val firstDataTableQuery = TableQuery[FirstDataTable]
val secondDataTableQuery = TableQuery[SecondDataTable]
etc ...

如何创建一个通用的 Slick 过滤器查询函数,该函数将 firstDataTableQuerysecondDataTableQuery 作为参数并在输入上进行相同的 slick 查询。仅过滤它们的公共字段或以另一种方式对它们的 SQL 表表示公共列进行过滤。比如这样:

def filter(genericTableQuery: TableQuery) = {
    genericTableQuery.filter { data => dataFilterFunction(data.symbol)
    }.filter(_.date >= someDate).sortBy(data => data.date.asc)
}

val firstTableResult = filter(firstDataTableQuery)
val seconfTableResult = filter(secondDataTableQuery)
etc ...

我查看了这个主题,但仍然无法提出解决方案:

Slick 3 reusable generic repository

Scala reflection to instantiate scala.slick.lifted.TableQuery

【问题讨论】:

    标签: scala reflection slick-3.0 cake-pattern


    【解决方案1】:

    如何让数据表类扩展一个公共特征,进而扩展数据类的一个公共特征,例如:

    trait Data {
      def symbol: String
      def date: Timestamp
    }
    // make FirstData and SecondData extend the above trait
    
    trait GenericDataTable extends Data {
      def symbol: Rep[String]
      def date: Rep[Timestamp]
      def pk: PrimaryKey
    }
    
    
    class FirstDataTable(tag: Tag) extends Table[FirstData](tag, "firstData") with GenericDataTable {
    // ...
    

    然后:

    def filter[T <: GenericDataTable](genericTableQuery: TableQuery[T]) = // ...
    

    【讨论】:

      【解决方案2】:

      invariant,非常感谢。你给我指出了正确的方向。我稍微修改了你的答案,一切正常)

      性状:

      trait Data {
                  def symbol: String
                  def date: Timestamp
                  }
      
      trait GenericDataTable[T <: Data] extends Table[T] {
                  def symbol: Rep[String]
                  def date: Rep[Timestamp]
                  def pk: PrimaryKey
                  }
      

      FirstData 和 FirstDataTable 类如下所示:

      case class FirstData(
                  symbol: String,
                  date: Timestamp,
                  firstField: Double) extends Data
      
      class FirstDataTable(tag: Tag) extends Table[FirstData(tag,"firstData") 
          with GenericDataTable[FirstData] {
                  def symbol = column[String]("symbol")
                  def date = column[Timestamp]("date")
                  def firstField= column[Double]("firstField")
                  def * = (symbol, date, firstField) <> ((FirstData.apply _).tupled, FirstData.unapply)
                  def pk = primaryKey("pk_firstData", (symbol, date))
          }
      

      最终函数如下所示:

      private def filter[M <: Data, T <: GenericDataTable[M]] (genericTableQuery: TableQuery[T]) = {
                  genericTableQuery.filter { data => dataFilterFunction(data.symbol)}.
                  filter(_.date >= someDate).sortBy(data => data.date.asc)
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多