我有一个可以为空的列的表,当查询空列时,它会抛出错误
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")
使用可空列?
答案 0 :(得分:8)
如果您正在阅读可以为空的列,那么确实应该将其绑定到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 *)
答案 1 :(得分:0)
如果你看here,你会发现你没有找到任何东西。但是看source code我可以假设你可以像这样自己实现它:
def strOpt(columnName: String)(implicit c: Column[Option[String]]): RowParser[Option[String]] =
get[Option[String]](columnName)(c)
但是,没有测试它,但应该可以正常工作。