an in中的"In"条款?

Fre*_*ind 26 scala anorm

在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)


mba*_*ker 8

搞定了!这个帖子还没有真正的更新,但似乎仍然有用.因此,并且因为没有答案,我以为我会把我扔进去考虑.

Anorm不支持​​'IN'条款.我怀疑他们会不会.你无法做任何事情让他们工作,我甚至读了一篇文章,其中anorm专门删除了这些条款,因为他们让Anorm觉得'就像一个ORM'.

但是,将SqlQuery包装在支持IN子句的短类中,然后在需要时将该类转换为SqlQuery相当容易.

而不是在这里粘贴代码,因为它有点长,这里是我的博客的链接,我发布了代码以及如何使用它.

在与Anorm的条款中

基本上,当您从我的博客获得代码时,您的语句如下所示:

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)

  • 此解决方案实际上与问题中建议的解决方案相同,但有一个例外,即它容易受到 SQL 注入的攻击,因为您将参数直接粘贴到查询字符串中(没有转义!),而不是使用绑定参数。为了节省14个角色,不值得! (3认同)