繁体   English   中英

在playframework的子句中的mysql查询

[英]mysql query in clause at playframework

在下面的两个sql查询中sql1不选择任何行,而sql2111@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)))
    }

在phpmyadmin中,当我手动运行此查询时,它会返回6行,然后为什么不能在这里正常运行。 我正在使用scala 2.1和play framework 2.2

那是行不通的。 传递users虽然on将要逃离整个字符串,因此它会显示为一个值,而不是一个列表。 实际上,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM