【发布时间】: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 过滤器查询函数,该函数将 firstDataTableQuery 或 secondDataTableQuery 作为参数并在输入上进行相同的 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