我有一个使用光滑的查询,它不是一个简单的光滑查询。
该查询是一个select查询,它从名为Employee的表中获取记录。结果类型为Employee
。
现在有一个字符串列表
val nameFilter= List("Sachin","Naveen"")
这个“nameFilter”动态出现,可能有任意数量的名称
var result= dbHandle.db.run((query.drop(10).take(10)).result
变量query
只是Employee表的select查询,它选择11到20之间的记录范围。
现在我需要过滤“nameFilter”中提到的名称的记录,然后选择11到20之间的记录。这意味着我需要一个带有“IN”子句的查询。
请注意,这不是一个简单的Slick SQL查询,我必须以上述格式构建查询。
答案 0 :(得分:7)
您可以使用.inSet方法执行此操作(请参阅here):
油滑
光滑的查询是可组合的。子查询可以简单地组合,其中类型可以解决,就像任何其他Scala代码一样。
val address_ids = addresses.filter(_.city === "New York City").map(_.id) people.filter(_.id in address_ids).result // <- run as one query
方法.in期望子查询。对于内存中的Scala集合,可以使用 .inSet 方法。
这对您的代码意味着:
val nameFilter= List("Sachin","Naveen")
val filteredQuery = query.filter(_.name.inSet(nameFilter))
var result= dbHandle.db.run((filteredQuery.drop(10).take(10)).result
根据输入的来源,您应该考虑使用 .inSetBind 来转义输入(请参阅this SO post)。