正如另一个答案所建议的那样,使用静态查询进行此操作很繁琐。静态查询接口要求您将绑定参数描述为 Product
。(Int,Int,String *)
不是有效的Scala代码,而使用 (Int,Int,List [String])
也需要一些不良处理方式。此外,必须确保 locationCodes.size
始终等于查询中的 (?, ?...)
的数量,这是脆弱的。
实际上,这并不是太大的问题,因为您应该使用查询单子(query monad)来解决,这是使用Slick的类型安全和推荐方式。
val visitorId: Int =
val locationCodes = List("loc1","loc2","loc3"...)
val q = for {
v <- Visits
if v.visitor is visitorId.bind
if v.location_code inSetBind locationCodes
} yield v
println(q.selectStatement)
q.list
假设您的表格设置如下:
case class Visitor(visitor: Int, ... location_code: String)
object Visitors extends Table[Visitor]("visitor") {
def visitor = column[Int]("visitor")
def location_code = column[String]("location_code")
def * = visitor ~ .. ~ location_code <> (Visitor, Visitor.unapply _)
}
请注意,您始终可以将查询包装在方法中。
def byIdAndLocations(visitorId: Int, locationCodes: List[String]) =
for {
v <- Visits
if v.visitor is visitorId.bind
if v.location_code inSetBind locationCodes
} yield v
}
byIdAndLocations(visitorId, List("loc1", "loc2", ..)) list