我正在尝试使用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的正确方法是什么?
答案 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注入。