繁体   English   中英

Anorm 2.3 多值参数:必需的 anorm.NamedParameter

[英]Anorm 2.3 multi-value parameter: required anorm.NamedParameter

在 play 框架 2.3 上使用 Scala 2.11.1。

因为 Anorm 在以前的版本中不支持多值参数,所以我使用了David 的解决方法。 Anorm 现在支持多值参数,我开始删除解决方法并使用 Anorm 多值参数。

提到的例子[原文如此]:

// 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

取决于我是否尝试列表或序列(或映射它的建议之一)。

到目前为止,我不是专家,我认为它缺少一些隐式转换? 不知道如何/什么/在哪里。 欢迎提示/建议/解决方案!

查看 Anorm 文档,您将看到没有使用 List 的多值示例。 实际上,这是NamedParameter因为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 中的更改(支持列表)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM