如何在Slick中使用IN子句?

Ram*_*hna 6 mysql sql database scala slick

我有一个使用光滑的查询,它不是一个简单的光滑查询.该查询是一个select查询,它从名为Employee的表中获取记录.结果是类型Employee类.

现在有一个字符串列表

val nameFilter= List("Sachin","Naveen"")
Run Code Online (Sandbox Code Playgroud)

这个"nameFilter"是动态的,它可能有任意数量的名称

var result= dbHandle.db.run((query.drop(10).take(10)).result
Run Code Online (Sandbox Code Playgroud)

该变量query 只是Employee表的select查询,它选择11到20之间的记录范围.

现在我需要过滤"nameFilter"中提到的名称的记录,然后选择11到20之间的记录.这意味着我需要一个带有'IN'子句的查询.

请注意,这不是一个简单的Slick SQL查询,我必须以上述格式构建查询.

thw*_*gan 10

您可以使用方法.inSet(请参阅此处)执行此操作:

华而不实的

光滑的查询是可组合的.子查询可以简单地组合,其中类型可以解决,就像任何其他Scala代码一样.

val address_ids = addresses.filter(_.city === "New York City").map(_.id)
people.filter(_.id in address_ids).result // <- run as one query
Run Code Online (Sandbox Code Playgroud)

方法.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
Run Code Online (Sandbox Code Playgroud)

根据输入的来源,您应该考虑使用.inSetBind来转义输入(请参阅此SO帖子).