【问题标题】:Slick compile query with Set[Int] parameter使用 Set[Int] 参数的 Slick 编译查询
【发布时间】:2016-03-09 20:35:34
【问题描述】:

我有一个以Seq[Int] 作为参数的查询(并像WHERE x IN (...) 一样执行过滤),我需要编译它,因为这个查询很复杂。但是,当我尝试天真的方法时:

Compiled((xs: Set[Int]) => someQuery.filter(_.x inSet xs))

失败并显示消息

Computation of type Set[Int] => Query[SomeTable, SomeValue, Seq] cannot be compiled (as type C)

Slick 可以编译将一组整数作为参数的查询吗?

更新:我使用 PostgreSQL 作为数据库,所以可以使用数组而不是 IN 子句,但是如何?

【问题讨论】:

    标签: postgresql scala prepared-statement slick slick-3.0


    【解决方案1】:

    对于 PostgreSQL 数据库,解决方案比我想象的要简单得多。

    首先,PostgreSQL 需要一个支持数组的特殊 Slick 驱动程序。它通常已经包含在依赖 PgSQL 特性的项目中,因此完全没有问题。我用this driver

    主要思想是用 PgSQL 特定的数组运算符 x = ANY(arr) 替换普通的 SQL IN (...) 子句,该子句采用与列表中项目数量相同的绑定参数数量,因此不能由 Slick 静态编译,这数组只接受一个参数。使用这样的代码很容易:

    val compiledQuery = Compiled((x: Rep[List[Int]]) => query.filter(_.id === x.any))
    

    此代码将生成类似WHERE x = ANY(?) 的查询,它只使用一个参数,因此 Slick 将接受它进行编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      相关资源
      最近更新 更多