Anorm 2.3多值参数:需要anorm.NamedParameter

时间:2014-08-05 14:00:40

标签: scala anorm playframework-2.3

在play framework 2.3上使用scala 2.11.1。

因为Anorm在以前的版本中不支持muli值参数,所以我使用David's解决方法。 Anorm现在supports multi-value parameters我开始删除变通方法并使用Anorm muli-value参数。

example [原文如此]提到:

// With default formatting (", " as separator)
SQL("SELECT * FROM Test WHERE cat IN ({categories})").
  on('categories -> Seq("a", "b", "c")
// -> SELECT * FROM Test WHERE cat IN ('a', 'b', 'c')

然而我的代码:

val names = List("Able", "Baker", "Charlie") // Passed as a parameter to my method!
val result =
  SQL( """
    SELECT city
    FROM addresses
    WHERE name IN ({names});
  """ ).on( 'names -> names ).as( scalar[String] * )

给了我这个错误:

type mismatch;
 found   : (Symbol, List[String])
 required: anorm.NamedParameter

type mismatch;
 found   : (Symbol, scala.collection.immutable.Seq[String])
 required: anorm.NamedParameter

取决于我是否尝试列表或序列(或其中一个suggestions来映射它)。

到目前为止,我没有专家,而且我认为它缺少一些隐式转换?无知找出/如何/在哪里。欢迎提示/建议/解决方案!

1 个答案:

答案 0 :(得分:0)

查看Anorm文档,您将看到没有使用List的多值示例。事实上,NamedParameter的实例仅用于Seq[T]

只需将代码更新为val names = Seq("Able", "Baker", "Charlie")即可使其有效(并编译)。

我建议使用Anorm插值编辑代码:

val result = 
  SQL"SELECT city FROM addresses WHERE name IN ($names)" as scalar[String].*

// OR (if names won't change):
val result = SQL"""SELECT city FROM addresses
    WHERE name IN (${Seq("Able", "Baker", "Charlie")})""".
  as(scalar[String].*)

编辑:查看Anorm https://github.com/playframework/playframework/pull/3257中的更改(支持列表)