在 Scala Anorm 中映射的结果

Result to Map in Scala Anorm

我正在尝试从结果集中获取 name -> 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.apply(SqlStatementParser.scala:43)
at anorm.SqlStatementParser$$anonfun.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.apply(Parsers.scala:242)
at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map.apply(Parsers.scala:242)
at scala.util.parsing.combinator.Parsers$$anon.apply(Parsers.scala:222)
at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map.apply(Parsers.scala:242)
at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map.apply(Parsers.scala:242)
at scala.util.parsing.combinator.Parsers$$anon.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.apply(SqlStatementParser.scala:26)
at anorm.SqlStatementParser$$anonfun$parse.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.5 和用 scala 2.11

构建的 anrom 2.4.0-M3

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

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

最后结果是元组列表,可以用.toMap

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