2016-12-14 4 views
0

Я пытаюсь создать динамический запрос с динамическими параметрами в анормах. Вот почему мне нужны параметры, с которыми я работаю, как список. После док Scala Anorm 2.5.xAnorm seq of NamedParameter

Это анализатор, который я использую

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

Casting при возникновении ошибки несоответствие типов компиляции не является решением проблемы.

Способ исправить это, чтобы использовать соответствующий тип. Там, тип SQL(query).on(parameters: _*) - anorm.SimpleSql[anorm.Row] (совсем нет List[Map[String, Any]]).

Настоятельно рекомендуется сначала прочитать documentation.

+0

Извините, я не копировал весь код, и я забыл поставить парсер, что я создал несколько строк до и .as (парсер. *), Который возвращает тип List [Map [String, Any] ]. Я отредактирую это. Моя проблема - это строка, которую я прокомментировал во втором примере 'Параметры val: Seq [NamedParameter] = Seq [NamedParameter] (searchParameters.map (field => field.sqlColumn -> field.value): _ *) ' Как я уже сказал, я следую документации. это пример того, что я пытаюсь использовать 'val nps = Seq [NamedParameter] (// Кортежи как NamedParameter перед Any " a "->" 1 "," b "->" 2 "," c "-> 3)' –

+0

Как указано в документации, это небезопасно для этого – cchantep

+0

Я не нахожу никакого типа. Я пытаюсь использовать третий пример в документе, как этот 'Seq [NamedParameter] (searchParameters.map (field => field.sqlColumn -> field.value): _ *)', но я не могу понять, почему это происходит скомпилировать с сообщением 'type mismatch, expected: Seq [NamedParameter], фактический Seq [(String, Any)]' –

Смежные вопросы