使用 Set[Int] 参数光滑编译查询

Slick compile query with Set[Int] parameter

我有一个以 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数据库,解决方案比我想象的简单多了。

首先,需要一个支持数组的PostgreSQL专用Slick驱动程序。它通常已经包含在依赖 PgSQL 功能的项目中,所以根本没有麻烦。我用 this driver.

主要思想是替换普通的 SQL IN (...) 子句,该子句采用与列表中项目数量相同的绑定参数数量,因此 Slick 无法使用 PgSQL-特定的数组运算符x = ANY(arr),它只为数组取一个参数。使用这样的代码很容易做到:

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

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