scala - 如何在 Anorm 中处理 null

标签 scala anorm

我有一个可以为空列的表,当查询空列时,它抛出了错误

 val row: List[(String,String)] = SQL("select top 10 Spare_Part part,Pricing_Category cat from Price_Point_Base")
                .as((str("part"))~ str("cat") map(flatten) *)

我检查了链接 https://www.playframework.com/documentation/2.0/ScalaAnorm .

它只放弃使用类似的东西处理可为空的列

SQL("Select name,indepYear from Country")().map { row =>
  row[String]("name") -> row[Option[Int]]("indepYear")
}

但是由于 str("part")row[String]("name") 更紧凑,所以我想尝试使用 str("part"),但是如何使 str("part") 与可为空的列一起工作?

最佳答案

如果您正在读取一个可为空的列,您真的 应该将它绑定(bind)到一个 Option[String] 以表示它可能缺少一个值。 Anorm 不会将其转换为 null,而是会抛出错误。

val row: List[(Option[String], String)] = 
    SQL("select top 10 Spare_Part part,Pricing_Category cat from Price_Point_Base")
       .as( get[Option[String]("part") ~ str("cat") map(flatten) *)

然而,这很困惑,如果您想为 String 提供默认值,会变得更加困惑。我们可以制作一个可重用的解析器,将 NULL 值默认为空字符串:

val parser: RowParser[(String, String)] = {
    get[Option[String]]("part") ~ get[Option[String]]("cat") map {
       case part~cat => (part.getOrElse(""), cat.getOrElse(""))
    }
}

然后应用它:

val row: List[(String, String)] = 
    SQL("select top 10 Spare_Part part,Pricing_Category cat from Price_Point_Base")
       .as(parser *)

关于scala - 如何在 Anorm 中处理 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25640468/

相关文章:

scala - 执行更新和执行插入之间的 Anorm Scala 区别

scala - 使用 Play 框架和 Anorm 保留列表

java - 在 Spark MLlib 上使用来自 Java 的 Breeze

scala - 修改不可变集合的惯用方法

playframework-2.0 - 如何理解 Anorm 解析器?

scala - 数据库插件未在 Play 2.0 中注册

placeholder - play2的异常中sql的 "?"占位符在哪里

Scala 在 Haskell 中的部分函数

scala - 为什么 Scala 中没有 "Functor"特征?

正则表达式,http 链接不是图像的 url