Anorm null值

时间:2014-10-22 12:56:45

标签: scala anorm

我正在编写服务器,在我的数据库上执行任何选择查询并返回json。我已经完成了大部分任务,但我坚持将可以为空的列解析为字符串。

val result = SQL("SELECT * FROM Table limit 5;")().map(_.asList.map({_.toString})).toList
val jsonResp = Json.toJson(result)

如果列可以具有空值字符串Some(123)而不是123,则会生成。我尝试使用match但是我没有使用compose该命令。也许你有一些类似的问题,你知道如何处理这种反应?

修改 我通过添加模式匹配取得了一些进展:

    val result = SQL(query)()
      .map(_.asList.map(
    {
      case Some(s) => s.toString
      case None => ""
      case v => v.toString
    }
    )).toList

但我不确定这是解决这个问题的好方法。还在等待想法

2 个答案:

答案 0 :(得分:1)

Anorm支持可空列作为可选值。

您将行返回为原始值列表。最好使用解析器API来指示如何正确提取值。 E.g。

SQL("SELECT a, b, c ...").as(get[Option[String]]("a") ~ int("b") ~ str("c) map { case a ~ b ~ c => MyClass(a, b, c) }.*)

MyClass列表的形式返回SQL结果,其中属性为Option[String]IntString

Anorm文档还有很多其他的例子。

答案 1 :(得分:-1)

最好将数据库中的可选条目映射到json中的可选字段;大多数scala json库将适当地呈现具有Option类型的字段。你想要将一个整数值渲染为json的字符串似乎很奇怪 - json对于整数有一个非常好的数字类型。

如果您肯定希望以这种方式将Option[Int]转换为字符串,最明确的方式可能是o.map(_.toString).getOrElse("");因此,您可以编写_.asList.map{_.map{_.toString}.getOrElse("")}而不是模式匹配。我不太了解特定的SQL库,无法知道结果是否静态地知道是否为Option类型;如果值的类型为Any,那么您可能需要按照您的方式匹配选项和非选项。