2016-12-14 10 views
0

私は動的パラメータを動的クエリで作成しようとしています。だから私はリストとして、私が働いているパラメータが必要です。ドキュメント以下のScala Anorm 2.5.xNamedParameterのAnorm seq

これは私がこのコードは

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

を動作しますが、この1つは

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.*) 

をした場合、コンパイルされません

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

を使用しているパーサはあるIこのように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

申し訳ありませんが、私はすべてのコードをコピーしていないので、前に数行作成したパーサと、List [Map [String、Any]型を返す.as(パーサ。*) ]。私はそれを編集します。 私の問題は、2番目の例でコメントした行です 'valパラメータ:Seq [NamedParameter] = Seq [NamedParameter](searchParameters.map(field => field.sqlColumn - > field.value):_ * ) ' 私が言ったように、私はドキュメントに従っています。これは私が使用しようとしている例です 'val nps = Seq [NamedParameter](//任意の より前のNamedParameterとしてのタプル" a " - >" 1 "、" b " - >" 2 "、" c " - > 3)' –

+0

ドキュメントに示されているとおり、それは安全ではありません – cchantep

+0

私はどんなタイプもキャストしていません。私はこの 'のSeq [NamedParameter](searchParameters.map(フィールド=> field.sqlColumn - > field.value):_ *)のようなドキュメントには第三の例を使用しようとしている'しかし、それはdoesnの理由を私は理解できませんSeq [NamedParameter]、実際の配列[(文字列、どれ)] ' –

関連する問題