【问题标题】:How to pass an array to a slick SQL plain query?如何将数组传递给光滑的 SQL 普通查询?
【发布时间】:2021-09-18 15:44:47
【问题描述】:

如何将数组传递给光滑的 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])

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    您链接的问题指向添加此内容的提交:

    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"..." 字符串时在范围内。

    【讨论】:

    【解决方案2】:

    我遇到了同样的问题并进行了搜索。 我用这样的隐式 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)]
        }
    

    【讨论】:

      猜你喜欢
      • 2014-08-15
      • 2018-08-29
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 2021-03-30
      • 1970-01-01
      相关资源
      最近更新 更多