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

时间:2016-03-09 20:35:34

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

我有一个查询以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编译以一组整数作为参数的查询吗?

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

1 个答案:

答案 0 :(得分:4)

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

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

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

x = ANY(arr)

此代码将生成val compiledQuery = Compiled((x: Rep[List[Int]]) => query.filter(_.id === x.any)) 之类的查询,它只使用一个参数,因此Slick会接受它进行编译。