【问题标题】:A Scala function that returns one of two types of Slick TableQuerys一个 Scala 函数,它返回两种类型的 Slick TableQuerys 之一
【发布时间】:2018-06-12 11:43:21
【问题描述】:

假设我有以下特质。

trait ModelTrait{
  def id: Option[Long]
  def name: String
}

我有两张桌子。他们的案例类和tableQuery字段如下所示。

val modelOneTable = TableQuery[ModelOnes]
val modelTwoTable = TableQuery[ModelTwos]

case class ModelOne(id: Option[Long], name: String) extends ModelTrait

case class ModelTwo(id: Option[Long], name: String) extends ModelTrait

我想创建一个函数,根据它的输入,返回 tableQuery 字段之一。像这样的:

def getTableQuery(which: String): TableQuery[Table[ModelTrait]] = {
which match {
   case "One" => modelOneTable
   case _ => modelTwoTable
}

请注意,modelOneTableTableQuery[ModelOnes]ModelOnes(带 s)类扩展 Table[ModelOne]ModelTwo 也是如此。因此函数返回TableQuery[Table[ModelTrait]]

class ModelOnes(tag: Tag) extends Table[ModelOne](tag, "modelOnes") {
  // ...
}

class ModelTwos(tag: Tag) extends Table[ModelTwo](tag, "modelTwos") {
  // ...
}

但我的 case 语句中出现类型不匹配错误。有人可以帮忙吗?

【问题讨论】:

  • TableQuery 定义在哪里?
  • @giorgio-b 这是一个 Slick 库类。您可以将其作为依赖项添加到您的 build.sbt 文件 "com.typesafe.slick" %% "slick" % "3.2.3"
  • 我认为这是不可能的,因为 Table 类是不变的abstract class Table[T](_tableTag: Tag, ...。如果它是协变的,就像class Table[+T]

标签: mysql scala slick


【解决方案1】:

您需要为其他字符串指定 case 子句:

which match {
   case "One" => modelOneTable
   case "Two" => modelTwoTable
   case _ => ... // which TableQuery should be returned for other strings
}

【讨论】:

  • 对不起,在我的实际配置中,我确实是这样写的,但我仍然得到错误。我将编辑问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 2021-03-22
  • 2020-04-02
相关资源
最近更新 更多