首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Anorm2.3多值参数:必需的anorm.NamedParameter

Anorm2.3多值参数:必需的anorm.NamedParameter
EN

Stack Overflow用户
提问于 2014-08-05 14:00:39
回答 1查看 1.6K关注 0票数 1

在play Framework2.3上使用Scala2.11.1。

由于Anorm在以前的版本中不支持多值参数,所以我使用了大卫氏解决方案。Anorm现在是支座多值参数和我开始删除解决方案,使用Anorm多值参数。

示例 sic提到:

代码语言:javascript
复制
// 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')

但我的准则是:

代码语言:javascript
复制
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] * )

给我这个错误:

代码语言:javascript
复制
type mismatch;
 found   : (Symbol, List[String])
 required: anorm.NamedParameter

代码语言:javascript
复制
type mismatch;
 found   : (Symbol, scala.collection.immutable.Seq[String])
 required: anorm.NamedParameter

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

我不是专家,到目前为止,我认为它缺少一些隐含的转换?不知道怎么/什么/在哪里。小贴士/建议/解决方案欢迎!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-05 14:55:43

查看Anorm文档,您将看到没有使用List的多值示例。实际上,这是故意的,因为NamedParameter的实例只为Seq[T]实现。

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

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

代码语言:javascript
复制
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中的更改(支持列表)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25140720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档