是否可以在Slick查询模板中使用List或Set类型的参数?(提升的API)

lon*_*uro 3 scala slick

是否可以在预编译的Slick查询中将集合用作参数?

就像是:

private val findByIds = for {
  ids <- Parameters[Set[Int]]
  meta <- AssetMetadatas if meta.id inSet ids
} yield meta
Run Code Online (Sandbox Code Playgroud)

不幸的是上面没有编译:

不知道如何拆开scala.collection.immutable.Set [INT]到scala.collection.immutable.Set [INT]和包装,以任何IDS < - 参数[设置[INT]] ^

cvo*_*ogt 9

你现在无法使用inSet预编译查询,无论是在Slick 1还是在Slick 2中.当您考虑到不同的Set大小的SQL中的查询必须不同时,这是有意义的.

  • 为0: WHERE false
  • 为1: WHERE id = ?
  • 为2: WHERE id IN (?,?)
  • 为3: WHERE id IN (?,?,?)
  • ...

这通常不能预编译,因此Slick必须每次都为它编译SQL.我们可能会在某些时候为某些后端支持它.如果它很重要,您可以自己预编译一些选定的集合大小的查询(使用&&==不是代替inSet).

使用inSetBind而不是inSet将set作为参数传递给预准备语句,而不是将它们作为文字编译到SQL字符串中.如果您以这种方式配置,这允许您的连接池缓存预准备的语句.所以Slick仍然需要编译查询,但至少你的数据库可以缓存查询计划.