正如另一个答案所暗示的,这对于静态查询来说很麻烦。静态查询接口要求您将绑定参数描述为Product
. (Int, Int, String*)
不是有效的scala,并且使用(Int,Int,List[String])
也需要一些kludges。此外,必须确保locationCodes.size
始终等于(?, ?...)
查询中的数量是脆弱的。
在实践中,这并不是什么大问题,因为您想改用查询 monad,这是使用 Slick 的类型安全且推荐的方式。
val visitorId: Int = // whatever
val locationCodes = List("loc1","loc2","loc3"...)
// your query, with bind params.
val q = for {
v <- Visits
if v.visitor is visitorId.bind
if v.location_code inSetBind locationCodes
} yield v
// have a look at the generated query.
println(q.selectStatement)
// run the query
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")
// .. etc
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