2016-12-14 65 views
0

我試圖用anorm中的動態參數創建動態查詢。這就是爲什麼我需要我正在使用的參數,作爲一個List。繼DOC Scala Anorm 2.5.x命名參數的Anorm seq

這是我使用

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

回答

0

鑄造是不是一個解決方案。

修復它的方法是使用適當的類型。在那裏,SQL(query).on(parameters: _*)的類型是anorm.SimpleSql[anorm.Row](根本不是List[Map[String, Any]])。

強烈建議先閱讀documentation

+0

對不起,我沒有複製所有的代碼,我忘了把我之前創建的幾行解析器和.as(parser。*)返回類型List [Map [String,Any] ]。我會編輯它。 我的問題是我在第二個示例中註釋過的行 val參數:Seq [NamedParameter] = Seq [NamedParameter](searchParameters.map(field => field.sqlColumn - > field.value):_ * )' 正如我所說,我正在關注文檔。這是我試圖使用的示例 val nps = Seq [NamedParameter](//在任何 「a」 - >「1」,「b」 - >「2」,「c 「 - > 3)' –

+0

如文檔中所示,這樣做不安全 – cchantep

+0

我沒有鑄造任何類型。我試圖在文檔中使用第三個例子,像這個'Seq [NamedParameter](searchParameters.map(field => field.sqlColumn - > field.value):_ *)'但我不明白爲什麼它不會編譯消息'類型不匹配,期望:Seq [NamedParameter],實際Seq [(String,Any)]' –