【发布时间】:2014-08-31 03:45:03
【问题描述】:
我正在设计一个 2 层架构的 API 接口。它从 URL 中获取一个字符串参数 fieldName 并返回一个 JSON 字符串。 fieldName 指的是我的数据库表中的一个字段。您可以将其签名视为:
def controller(fieldName: String): String
在控制器中,我想在我的数据访问层调用一个方法来执行以下查询:
SELECT fieldName, SUM(salary) FROM Employee GROUP BY fieldName
由于字段的类型不同,查询结果的类型也会不同。该方法由泛型类型参数 T 参数化,该类型参数对应于名为 fieldName 的字段的类型。
def getTotalSalaryByField[T](fieldName: String): Map[T, Long]
- 如果 fieldName 是“age”,T 应该是 Int。
- 如果 fieldName 是“name”,T 应该是 String。 等等。
在运行时给定一个特定的 fieldName,我如何调用这个方法来给它正确的类型?
我不想写很多 if-else 或模式匹配语句来选择类型。它看起来像这样:
fieldName match {
case "age" => serializeToJson(getTotalSalaryByField[Int]("age"))
case "name" => serializeToJson(getTotalSalaryByField[String]("name"))
...
// 100 more for 100 more fields
}
这很难看。如果我用 Python 写这个,只需要一行:
json.dumps(getTotalSalaryByField(fieldName))
Scala 是不是不适合 Rest 后端编程?因为这似乎是人们会遇到的常见模式,而静态类型会阻碍。我希望看到一些关于我应该如何以 scala-ish 方式解决整个问题的建议,即使这意味着重塑、重写 DAL 和控制器。
编辑: @drexin,DAL 方法的实际签名是
def myDAOMethod[T](tf: Option[TimeFilter], cf: CrossFilter)
(implicit attr: XFAttribute[T]): Map[T, Long]
T 是 fieldName 的类型。 Long 是 y 的类型。如您所见,我需要根据 url 参数中的 fieldName 选择一个类型为 T。
编辑: 添加了一些代码并使用例清晰
【问题讨论】:
-
您希望 Scala 为您做什么?从不同的文本类型推断?除了模式匹配还有其他方法吗?
-
能否提供您要调用的方法的签名?
-
可能是 sqltyped project 是你真正追求的,这使用 scala 宏来为列提供正确的类型。
-
@goral, “除了模式匹配还有其他方法吗?”这是我的问题。
-
@drexin,问题已编辑。