是否可以在预编译的 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 大小的查询必须不同时,这是有道理的。
WHERE false
WHERE id = ?
WHERE id IN (?,?)
WHERE id IN (?,?,?)
这个一般不能预编译,所以Slick每次都要为它编译SQL。我们可能会在某个时候为某些后端提供支持。如果很重要,您可以自己为选定的集合大小预编译几个查询(使用
&&
和 ==
而不是 inSet
)。使用
inSetBind
而不是 inSet
将集合作为参数传递给准备好的语句,而不是将它们作为文字编译到 SQL 字符串中。这允许您的连接池缓存准备好的语句,如果您以这种方式配置它。所以 Slick 仍然需要编译查询,但至少你的数据库可以缓存查询计划。
关于scala - 是否可以在 Slick 查询模板中使用 List 或 Set 类型的参数? (提升API),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19926258/