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

标签 scala slick

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

就像是:

private val findByIds = for {
  ids <- Parameters[Set[Int]]
  meta <- AssetMetadatas if meta.id inSet ids
} yield meta

不幸的是,上面没有编译:

不知道如何将 scala.collection.immutable.Set[Int] 解包为 scala.collection.immutable.Set[Int] 并打包为 Any
ids <- 参数[Set[Int]]
^

最佳答案

您目前无法使用 inSet 预编译查询,无论是在 Slick 1 还是 Slick 2 中。当您考虑到 SQL 中针对不同 Set 大小的查询必须不同时,这是有道理的。

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

  • 这个一般不能预编译,所以Slick每次都要为它编译SQL。我们可能会在某个时候为某些后端提供支持。如果很重要,您可以自己为选定的集合大小预编译几个查询(使用 &&== 而不是 inSet )。

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

    关于scala - 是否可以在 Slick 查询模板中使用 List 或 Set 类型的参数? (提升API),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19926258/

    相关文章:

    scala - 光滑的 3.0 : Idiomatic way to GET results from the database inside of Option (Scala Play Framework)

    java - 从 Java(或 scala)调用具有类型参数的 Ceylon 顶级函数

    java.lang.ClassNotFoundException : org. 用于 Spark 3.0.0 的 apache.spark.sql.sources.v2.DataSourceV2

    Windows PATH 变量是否以管理员身份运行 CMD 是不同的

    scala - Scala 中的事务方法 Play with Slick(可能类似于 Spring @Transactional?)

    postgresql - 在 Slick 3.2.1 (Scala) 中使用过滤器的 where 子句中的 LIKE

    java - Slick 中的 transient 等效项

    scala - 为 Scala 和 Playframework 中的嵌套类创建 QueryStringBindable

    使用 Java 8 在 Debian 上安装 Scala 和 SBT

    scala - 使用 slick 插入和更新数据时丢弃值