【问题标题】:Anorm seq of NamedParameterNamedParameter 的异常序列
【发布时间】:2016-12-14 14:45:06
【问题描述】:

我正在尝试使用异常的动态参数创建动态查询。这就是为什么我需要我正在使用的参数作为列表。关注文档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

【问题讨论】:

    标签: scala anorm


    【解决方案1】:

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

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

    强烈建议先阅读documentation

    【讨论】:

    • 对不起,我没有复制所有代码,我忘了把我之前创建的解析器和返回类型 List[Map 的 .as(parser.*) [字符串,任何]]。我会编辑那个。我的问题是我在第二个示例val parameters: Seq[NamedParameter] = Seq[NamedParameter] (searchParameters.map(field => field.sqlColumn -> field.value): _*) 中评论的那一行,正如我所说,我正在关注文档。这是我尝试使用的示例val nps = Seq[NamedParameter]( // Tuples as NamedParameter before Any "a" -> "1", "b" -> "2", "c" -> 3)
    • 如文档中所述,这样做是不安全的
    • 我没有投射任何类型。我正在尝试使用文档中的第三个示例,例如 Seq[NamedParameter] (searchParameters.map( field => field.sqlColumn -> field.value): _*),但我不明白为什么它不能与消息 type mismatch, expected: Seq[NamedParameter], actual Seq[(String, Any)] 一起编译
    • 请阅读documentation。您的SearchParameter 要么是泛型类型(对于SearchParameter("column1", 1)1: Int,具有异构类型参数的实例,对于SearchParameter("column2", "2")"2": String,对于SearchParameter("column3", true)true: Boolean)或具有@987654337 的类@为value。任何导致searchParameters.map(field => field.sqlColumn -> field.value) 失去类型安全性并成为Seq[(String, Any)] ... Any 不是ParameterValue 的有效类型的方式。
    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 2014-04-18
    • 2012-07-23
    • 2010-12-15
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多