我有一个查询以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
子句,但是如何使用?
答案 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会接受它进行编译。