[英]mysql query in clause at playframework
in below two sql query sql1
not selecting any row, and sql2
selecting only 1 for 111@k2.com
在下面的两个sql查询中
sql1
不选择任何行,而sql2
为111@k2.com
仅选择1
var ids="'111@k2.com','222@k2.com','333@k2.com','444@k2.com','555@k2.com','666@k2.com'"
val sql1 = SQL("SELECT id,point,privacy FROM `pointTable` WHERE state=1 and id in ({users})").on("users" -> ids)
sql1().map { row =>
val point = if (row[Boolean]("privacy")) { row[Double]("point").toString } else { "0" }
println(write(Map("id" -> row[String]("id"), "point" -> point)))
}
val sql2 = SQL("SELECT id,point,privacy FROM `pointTable` WHERE state=1 and id in (" + ids + ")")
sql2().map { row =>
val point = if (row[Boolean]("privacy")) { row[Double]("point").toString } else { "0" }
println(write(Map("id" -> row[String]("id"), "point" -> point)))
}
in phpmyadmin when i run this query manualy it returns 6 rows then why not working perfectly here. 在phpmyadmin中,当我手动运行此查询时,它会返回6行,然后为什么不能在这里正常运行。 i am using play framework 2.2 with scala 2.1
我正在使用scala 2.1和play framework 2.2
That's not going to work. 那是行不通的。 Passing
users
though on
is going to escape the entire string, so it's going to appear as one value instead of a list. 传递
users
虽然on
将要逃离整个字符串,因此它会显示为一个值,而不是一个列表。 Anorm in Play 2.3 actually allows you to pass lists as parameters, but here you'll have to work around that. 实际上,Play 2.3中的Anorm允许您将列表作为参数传递,但是在这里您必须解决此问题。
val ids: List[String] = List("111@k2.com", "222@k2.com", "333@k2.com")
val indexedIds: List[(String, Int)] = ids.zipWithIndex
// Create a bunch of parameter tokens for the IN clause.. {id_0}, {id_1}, ..
val tokens: String = indexedIds.map{ case (id, index) => s"{id_${index}}" }.mkString(", ")
// Create the parameter bindings for the tokens
val parameters = indexedIds.map{ case (id, index) => (s"id_${index}" -> toParameterValue(id)) }
val sql1 = SQL(s"SELECT id,point,privacy FROM `pointTable` WHERE state=1 and id in (${tokens})")
.on(parameters: _ *)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.