在anorm中使用"in"子句似乎并不容易:
val ids = List("111", "222", "333")
val users = SQL("select * from users where id in ({ids})").on('ids-> ???).as(parser *)
Run Code Online (Sandbox Code Playgroud)
如何更换???零件?
我试过了:
on('ids -> ids)
on('ids -> ids.mkString("'","','","'"))
on('ids -> ids.mkString("','")
Run Code Online (Sandbox Code Playgroud)
但都没有效果.
我在讨论中看到了完全相同的问题: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()
Run Code Online (Sandbox Code Playgroud)
这太复杂了.
有没有更简单的方法?或者应该提供一些让它变得更容易的东西?
cch*_*tep 14
从2.3开始,Anorm现在支持这种情况(以及更多):"使用多值参数"
回到最初的例子,它给出了:
val ids = Seq("111", "222", "333")
val users = SQL("select * from users where id in ({ids})").on('ids-> ids).as(parser *)
Run Code Online (Sandbox Code Playgroud)
搞定了!这个帖子还没有真正的更新,但似乎仍然有用.因此,并且因为没有答案,我以为我会把我扔进去考虑.
Anorm不支持'IN'条款.我怀疑他们会不会.你无法做任何事情让他们工作,我甚至读了一篇文章,其中anorm专门删除了这些条款,因为他们让Anorm觉得'就像一个ORM'.
但是,将SqlQuery包装在支持IN子句的短类中,然后在需要时将该类转换为SqlQuery相当容易.
而不是在这里粘贴代码,因为它有点长,这里是我的博客的链接,我发布了代码以及如何使用它.
基本上,当您从我的博客获得代码时,您的语句如下所示:
RichSQL(""" SELECT * FROM users WHERE id IN ({userIds}) """).onList("userIds" -> userIds).toSQL.as(userParser *)(connection)
Run Code Online (Sandbox Code Playgroud)
小智 -1
User.find("id in (%s)"
.format(params.map("'%s'".format(_)).mkString(",") )
.list()
Run Code Online (Sandbox Code Playgroud)