2

ID のセットに一致する行を返すクエリを使用して、Anorm を使用して結果のリストを返そうとしています。例えば。

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") *)

ここで、ids は文字列 "1,2,3,4,5" で、最初の行のみが返されます。IDのセットを注入する正しい方法は何ですか?

4

1 に答える 1

5

私の知る限り、それを行う簡単な方法はありません。

これが私がそれを解決した方法です:

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") *
    )
  }
}

注意
ここで重要な部分は、SQL ステートメントの文字列フォーマットです。入力パラメーターを完全に制御できない場合、SQL インジェクションに対して脆弱です。

于 2013-04-08T08:42:52.070 に答える