繁体   English   中英

如何在Anorm中处理null

[英]How to handle null in 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")与nullable一起工作柱?

如果你正在读一空列,你真的应该给它绑定一个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 *)

如果你看这里,你会发现没有什么是你想要的。 但是看一下源代码我可以假设你可以自己实现它:

def strOpt(columnName: String)(implicit c: Column[Option[String]]): RowParser[Option[String]] =
  get[Option[String]](columnName)(c)

虽然没有测试,但应该可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM