Anorm:隐式转换 [all value(include null)] 到 [String]

Posted

技术标签:

【中文标题】Anorm:隐式转换 [all value(include null)] 到 [String]【英文标题】:Anorm: implicit convertion [all value(include null)] to [String] 【发布时间】:2016-03-29 00:13:56 【问题描述】:

我是 Scala 和 Play 框架的新手。我尝试从数据表中查询选定列的所有数据并将它们保存为 Excel 文件。

选定的列通常有不同的类型,例如 Int、Str、Timestamp 等。

我想转换所有值类型,包括 null 到 String (null转换为空字符串“”) 不知道列的实际类型,因此代码可以用于任何表。

根据Play的文档,我可以在下面编写隐式转换器,但是,这不能处理null。 google了很久,没找到解决办法。有人可以告诉我如何在隐式转换器中处理 null 吗?

先谢谢了~

implicit def valueToString: anorm.Column[String] =
    anorm.Column.nonNull1[String]  (value, meta) =>
        val MetaDataItem(qualified, nullable, clazz) = meta
        value match 
            case s: String              => Right(s) // Provided-default case
            case i: Int                 => Right(i.toString()) // Int to String
            case t: java.sql.Clob       => Right(t.toString()) // Blob/Text to String
            case d: java.sql.Timestamp  => Right(d.toString()) // Datatime to String
            case _                      => Left(TypeDoesNotMatch(s"Cannot convert $value: $value.asInstanceOf[AnyRef].getClass to String for column $qualified"))
        

    

【问题讨论】:

您在运行时看到了什么错误? 错误信息:java.lang.RuntimeException: Left(UnexpectedNullableFound(ColumnName(.valuea,Some(valuea)))) at anorm.MayErr$$anonfun$get$1.apply(MayErr.scala: 35) 【参考方案1】:

如documentation 所示,如果有Column[T],允许解析T 类型的列,如果列可以为空,则应询问Option[T],受益于通用支持为Option[T]

这是一个自定义的Column[String](确保使用的是自定义的,而不是提供的Column[String]),所以应该询问Option[String]

import myImplicitStrColumn
val parser = get[Option[String]]("col")

【讨论】:

嗨 cchantep,是的,我试过这个:implicit def valueToString: anorm.Column[Option[String]] = anorm.Column.nonNull1[Option[String]] (value, meta) => val MetaDataItem(qualified, nullable, clazz) = meta value match case s: Option[String] => .... case i: Option[Int] => ... case t: Option[java.sql.Clob] => ... case d: Option[java.sql.Timestamp] => ... case _ =>.. 但收到错误“无法将 Int 转换为 String....” 如前所述,您不应定义Column[Option[T]],而应使用通用Option 支持定义Column[T] + 我明白了...谢谢~我会试一试...我认为 Anorm 可能会提供更简单的方法来处理 null,因为这很常见。 确实,您尝试了一种比要求更复杂的方法,即定义Column[Option[T]] 而不仅仅是Column[T]。请查看文档。

以上是关于Anorm:隐式转换 [all value(include null)] 到 [String]的主要内容,如果未能解决你的问题,请参考以下文章

C# 隐式运算符 MyType(int value) 自动“支持”从浮点数转换

无法在 C# 中将类型 'byte[]' 隐式转换为 'byte?[]'

无法在 C# 中将类型“System.EventHandler”隐式转换为“System.Windows.Forms.KeyPressEventHandler”[重复]

解决Html.CheckBoxFor中”无法将类型 bool 隐式转换为 bool。存在一个显式转换..."的方法

可能导致精度或幅度损失的 Java 隐式强制转换? [复制]

TypeScript 中泛型的不安全隐式转换