我基本上想用更“光滑”的东西替换以下代码:
final case class User(firstName: String, lastName: String)
def dbAction(lastNameParts: Seq[String]): SqlStreamingAction[Vector[User], User, Effect]
implicit val getUserResult =
GetResult((r: PositionedResult) => {
val resultSet: ResultSet = r.rs
User(
resultSet.getString(1),
resultSet.getString(2)
)
})
val pattern = orgIds.mkString("|")
sql"""SELECT u.first_name, u.last_name
FROM users u
WHERE last_name ~* $pattern""".as[User]
所以生成的 SQL 将是:
SELECT u.first_name, u.last_name
FROM users u
WHERE last_name ~* '%bar|baz%';
因此,此 dbAction 将返回一个操作,我可以使用该操作来查询列表中包含某些名称部分的所有用户。
所以
dbAction(Seq("bar", "baz"))
将返回一个查询包含字符串“bar”或“baz”(不区分大小写)的所有姓氏的操作。我找到了一种查询单个模式的方法
val query = for {
user <- users if user.lastName like "%bar%"
} yield (user.firstName, user.lastName)
我找到了一种查询列表包含的方法
u <- users if u.lastName.inSet(Seq("bar", "baz"))
但找不到一种方法来结合它
编辑:另一种可能解决这个问题的方法是通过正则表达式。有没有办法实现类似下面的 SQL 语句:
select * from users where last_name ~ '[\w]*bar[\w]*|[\w]*baz[\w]*';
由于这是一个不同的问题,如何使用正则表达式我为此创建了一个不同的问题: Slick:有没有办法用正则表达式创建 WHERE 子句?