在anorm中使用“in”子句似乎不容易:

val ids = List("111", "222", "333")
val users = SQL("select * from users where id in ({ids})").on('ids-> ???).as(parser *)

如何替换???部分?

我试过了:
on('ids -> ids)
on('ids -> ids.mkString("'","','","'"))
on('ids -> ids.mkString("','")

但是没有办法。

我在讨论中看到了完全相同的问题:https://groups.google.com/d/topic/play-framework/qls6dhhdayc/discussion,作者有一个复杂的解决方案:
val params = List(1, 2, 3)

val paramsList = for ( i <- 0 until params.size ) yield ("userId" + i)

// ---> results in List("userId0", "userId1", "userId2")

User.find("id in ({%s})"

    // produces "id in ({userId0},{userId1},{userId2})"
    .format(paramsList.mkString("},{"))

    // produces Map("userId0" -> 1, "userId1" -> 2, ...)
    .on(paramsList.zip(params))
    .list()

这太复杂了。

有没有更简单的方法?还是应该提供一些游戏来简化游戏?

最佳答案

从2.3开始,Anorm现在支持这种情况(以及更多):"Using multi-value parameter"

回到初始示例,它给出:

val ids = Seq("111", "222", "333")
val users = SQL("select * from users where id in ({ids})").on('ids-> ids).as(parser *)

10-04 17:32