Play Framework 2.0使用Anorm在查询中表示集合的正确方法

时间:2013-04-07 16:12:35

标签: scala playframework-2.0 anorm

我正在尝试使用Anorm返回一个结果列表,该查询返回一组id的匹配行。例如

select *
from example
where id in (1,2,3,4,5)

如果我尝试

SQL(
    """
      select *
      from example 
      where id in ({ids})
    """
  ).on('ids -> ids).as(int("id") ~ str("name") *)

其中id是字符串“1,2,3,4,5”,它只返回第一行。注入一组id的正确方法是什么?

1 个答案:

答案 0 :(得分:5)

没有简单的方法来做AFAIK。

这就是我解决它的方法:

def findSomething(ids: String) = {
  // Split up the comma separated values
  val sids = ids split ","
  // Create a list of keys (id0, id1, id2, ...)
  val keys = for ( i <- 0 until sids.size ) yield ("id" + i)
  // Create a seq of parameterized values
  val values = sids map (toParameterValue(_))

  // Now zip together the keys and values into list of tuples
  val params = keys zip values

  DB.withConnection { implicit connection =>
    SQL(
      """
        select *
        from example 
        where id in ({%s})
      """.format(keys.mkString("},{"))
    ).on(
      params: _*
    ).as(
      int("id") ~ str("name") *
    )
  }
}

<强> NB
这里的关键部分是SQL语句中的字符串格式。如果您没有完全控制输入参数,那么它很容易被SQL注入。