【问题标题】:Result to Map in Scala AnormScala Anorm 中映射的结果
【发布时间】:2015-05-20 06:47:03
【问题描述】:

我正在尝试从结果集中获取名称 -> id 的映射。

val isp = SQL("select id, name from internet_service_providers").map { x => x[String]("name") -> x[String]("id") }

我无法理解为什么会出现此错误。

Exception in thread "main" java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object;
at anorm.SqlStatementParser$$anonfun$3.apply(SqlStatementParser.scala:43)
at anorm.SqlStatementParser$$anonfun$3.apply(SqlStatementParser.scala:43)
at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:136)
at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:135)
at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map$1.apply(Parsers.scala:242)
at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map$1.apply(Parsers.scala:242)
at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:222)
at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map$1.apply(Parsers.scala:242)
at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map$1.apply(Parsers.scala:242)
at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:222)
at scala.util.parsing.combinator.RegexParsers$class.parse(RegexParsers.scala:148)
at anorm.SqlStatementParser$.parse(SqlStatementParser.scala:11)
at anorm.SqlStatementParser$$anonfun$parse$1.apply(SqlStatementParser.scala:26)
at anorm.SqlStatementParser$$anonfun$parse$1.apply(SqlStatementParser.scala:26)
at scala.util.Try$.apply(Try.scala:161)
at anorm.SqlStatementParser$.parse(SqlStatementParser.scala:26)
at anorm.package$.SQL(package.scala:40)
at com.gumgum.nativead.NativeInventoryApp$.main(NativeInventoryApp.scala:49)
at com.gumgum.nativead.NativeInventoryApp.main(NativeInventoryApp.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)

我猜我在上面的代码中创建地图的方式可能完全错误,或者使用的库中存在 scala 版本不匹配。 我正在使用使用 scala 2.11 构建的 scala 2.11.5 和 anrom 2.4.0-M3

【问题讨论】:

    标签: scala anorm


    【解决方案1】:

    首先错误java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object;不是来自Anorm,而是来自Predef:找不到->运算符来构建元组,这很奇怪。我建议检查您的 scala 版本和依赖项,以确保没有拉出多个 scala lib。

    那么如果你想把一个Row变成一个元组,可以使用SqlParser.flatten

    最后作为结果将是一个元组列表,可以使用.toMap

    import anorm.SqlParser.{ flatten, str }
    SQL("...").as((str("name") ~ str("id")).map(flatten).*).toMap
    

    【讨论】:

    • 所有依赖项都有 2.11 但我看到 gradle 下载 2.11.5 和 2.11.6 版本的 scala 次要版本会是一个问题吗?
    • 这取决于你的开发环境。真的不认为这与 Anorm 有特殊关系。
    • 我正在运行一个 spark 应用程序,它在 scala 2.10 中运行,因为 Anorm 库是用 2.11 构建的,因此出现了这个问题
    猜你喜欢
    • 1970-01-01
    • 2013-01-13
    • 2015-07-02
    • 2017-10-26
    • 2016-02-24
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多