NamedParameter的Anorm seq

时间:2016-12-14 14:45:06

标签: scala anorm

我试图在anorm中使用动态参数创建动态查询。这就是为什么我需要我作为List使用的参数的原因。遵循文档Scala Anorm 2.5.x

这是我使用

的解析器
val parser = SqlParser.folder(Map.empty[String, (String, Any)]) { (map, value, meta) =>
    Right(map + (meta.column.alias.getOrElse(meta.column.qualified) -> (meta.clazz, value)))
}

此代码有效

val parameters: Seq[NamedParameter] = Seq[NamedParameter] ("column1" -> 1, "column2" -> "2", "column3" -> true)
val resultSet: List[Map[String, Any]] = SQL(query).on(parameters: _*).as(parser.*)

但是这个没有编译

case class SearchParameter(sqlColumn: String, value: Any)

val searchParameters = List(SearchParameter("column1", 1), SearchParameter("column2", "2"), SearchParameter("column3", true))
val parameters: Seq[NamedParameter] = Seq[NamedParameter] (searchParameters.map(field => field.sqlColumn -> field.value): _*) // this line doesn't compile
// type mismatch, expected: Seq[NamedParameter], actual Seq[(String, Any)]
val resultSet: List[Map[String, Any]] = SQL(query).on(parameters: _*).as(parser.*)

如果我尝试以这种方式施放Seq

val parameters: Seq[NamedParameter] = Seq[NamedParameter] (searchParameters.map(field => field.sqlColumn -> field.value): _*).asInstanceOf[NamedParameter]

它编译,但在运行时,它会抛出java.lang.ClassCastException

1 个答案:

答案 0 :(得分:-1)

发生类型不匹配编译错误时进行转换不是解决方案。

修复它的方法是使用适当的类型。在那里,SQL(query).on(parameters: _*)的类型为anorm.SimpleSql[anorm.Row](根本不是List[Map[String, Any]])。

强烈建议您先阅读documentation