如何将数组传递给巧妙的 SQL 普通查询?
How to pass an array to a slick SQL plain query?
如何将数组传递给灵活的 SQL 普通查询?
我尝试如下但失败了:
// "com.typesafe.slick" %% "slick" % "3.3.2", // latest version
val ids = Array(1, 2, 3)
db.run(sql"""select name from person where id in ($ids)""".as[String])
Error: could not find implicit value for parameter e: slick.jdbc.SetParameter[Array[Int]]
但是这张票似乎说它应该有效:
https://github.com/tminglei/slick-pg/issues/131
注意:我对下面的做法不感兴趣:
db.run(sql"""select name from person where id in #${ids.mkString("(", ",", ")")}""".as[Int])
您链接的问题指向添加以下内容的提交:
def mkArraySetParameter[T: ClassTag](/* ... */): SetParameter[Seq[T]]
def mkArrayOptionSetParameter[T: ClassTag](/* ... */): SetParameter[Option[Seq[T]]]
请注意,它们不是 implicit
。
您需要执行类似
的操作
implicit val setIntArray: SetParameter[Array[Int]] = mkArraySetParameter[Int](...)
并确保在您尝试构建 sql"..."
字符串时它在范围内。
我遇到了同样的问题并搜索了它。
我用这样的隐式 val 解决了它:
implicit val strListParameter: slick.jdbc.SetParameter[List[String]] =
slick.jdbc.SetParameter[List[String]]{ (param, pointedParameters) =>
pointedParameters.setString(f"{${param.mkString(", ")}}")
}
将其放入您的 slick-pg 配置文件中,并在需要的地方将其与其他 val 一起导入。
或者更严格,像这样:
implicit val strListParameter: slick.jdbc.SetParameter[List[String]] =
slick.jdbc.SetParameter[List[String]]{ (param, pointedParameters) =>
pointedParameters.setObject(param.toArray, java.sql.Types.ARRAY)
}
implicit val strSeqParameter: slick.jdbc.SetParameter[Seq[String]] =
slick.jdbc.SetParameter[Seq[String]]{ (param, pointedParameters) =>
pointedParameters.setObject(param.toArray, java.sql.Types.ARRAY)
}
并像这样使用 val:
val entries: Seq[String]
val query = {
sql"""select ... from xxx
where entry = ANY($entries)
order by ...
""".as[(Column, Types, In, Here)]
}
如何将数组传递给灵活的 SQL 普通查询? 我尝试如下但失败了:
// "com.typesafe.slick" %% "slick" % "3.3.2", // latest version
val ids = Array(1, 2, 3)
db.run(sql"""select name from person where id in ($ids)""".as[String])
Error: could not find implicit value for parameter e: slick.jdbc.SetParameter[Array[Int]]
但是这张票似乎说它应该有效: https://github.com/tminglei/slick-pg/issues/131
注意:我对下面的做法不感兴趣:
db.run(sql"""select name from person where id in #${ids.mkString("(", ",", ")")}""".as[Int])
您链接的问题指向添加以下内容的提交:
def mkArraySetParameter[T: ClassTag](/* ... */): SetParameter[Seq[T]]
def mkArrayOptionSetParameter[T: ClassTag](/* ... */): SetParameter[Option[Seq[T]]]
请注意,它们不是 implicit
。
您需要执行类似
的操作implicit val setIntArray: SetParameter[Array[Int]] = mkArraySetParameter[Int](...)
并确保在您尝试构建 sql"..."
字符串时它在范围内。
我遇到了同样的问题并搜索了它。 我用这样的隐式 val 解决了它:
implicit val strListParameter: slick.jdbc.SetParameter[List[String]] =
slick.jdbc.SetParameter[List[String]]{ (param, pointedParameters) =>
pointedParameters.setString(f"{${param.mkString(", ")}}")
}
将其放入您的 slick-pg 配置文件中,并在需要的地方将其与其他 val 一起导入。
或者更严格,像这样:
implicit val strListParameter: slick.jdbc.SetParameter[List[String]] =
slick.jdbc.SetParameter[List[String]]{ (param, pointedParameters) =>
pointedParameters.setObject(param.toArray, java.sql.Types.ARRAY)
}
implicit val strSeqParameter: slick.jdbc.SetParameter[Seq[String]] =
slick.jdbc.SetParameter[Seq[String]]{ (param, pointedParameters) =>
pointedParameters.setObject(param.toArray, java.sql.Types.ARRAY)
}
并像这样使用 val:
val entries: Seq[String]
val query = {
sql"""select ... from xxx
where entry = ANY($entries)
order by ...
""".as[(Column, Types, In, Here)]
}