简体   繁体   English

在Scala Anorm中映射的结果

[英]Result to Map in Scala Anorm

I am trying to get a map of name -> id from the resultset. 我正在尝试从结果集中获取名称-> id的映射。

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

I am unable to understand why I am getting this error. 我无法理解为什么出现此错误。

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)

I am guessing that my way of creating the map in code above might be completely wrong or there is a scala version mismatch in the libs used. 我猜想我在上面的代码中创建地图的方式可能完全错误,或者所使用的库中存在scala版本不匹配。 I am using scala 2.11.5 and anrom 2.4.0-M3 built with scala 2.11 我正在使用scala 2.11.5和使用scala 2.11构建的anrom 2.4.0-M3

First the error java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object; 首先是错误java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(Ljava/lang/Object;)Ljava/lang/Object; is not from Anorm but from Predef : the -> operator is not found to build tupple, which is quite weird. 不是来自Anorm,而是来自Predef :找不到->运算符来生成tupple,这很奇怪。 I would suggest to check your scala version and dependencies, to be sure there is not several scala lib pulled. 我建议检查您的scala版本和依赖项,以确保没有拉出几个scala库。

Then if you want to turn a Row as a tuple, SqlParser.flatten can be used. 然后,如果要将Row变成元组, SqlParser.flatten可以使用SqlParser.flatten

Finally as the result will be a list of tuple, .toMap can be used. 最后,由于结果将是一个元组列表, .toMap可以使用.toMap

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

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

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