问题描述
column
------
a
ab
abc
b
bc
bca
c
cba
我有一个列表= [a,b,bc],我希望表中的所有行都从列表中的任何元素开始。
column
------
a
ab
abc
b
bc
bca
如何使用光滑的形式形成queryCondition:
table = TableQuery[Table]
mapping = list map
{
value =>
table.column like value + "%"
}
解决方法
据我所知,您希望查询以下形式:
SELECT column FROM table WHERE
column LIKE 'a%'
OR column LIKE 'b%'
OR column LIKE 'bc%'
基本上翻译成Slick:
val query = table.filter(row =>
row.column like 'a%' || row.column like 'b%' || row.column like 'bc%'
)
所以现在的问题是如何从Scala列表构造LIKE
部分。
标准馆藏库有几种方法可以做到这一点。这是一个(reduceLeft
):
val patterns = Seq("a","b","bc").map(_ + "%")
val query = table.filter(row =>
patterns.map(pattern => row.column like pattern).reduceLeft(_ || _)
)
我们正在做的是:
- 将
patterns
的列表转换为Slicklike
表达式的列表 - 然后将Slick表达式列表与
||
组合 - 这为我们提供了一个Slick表达式(将
like
与or
结合使用)在filter
内部使用。
您也可以使用like
代替startsWith
,以避免将%
添加到字符串列表中:
val patterns = Seq("a","bc")
val query = table.filter(row =>
patterns.map(pattern => row.column startsWith pattern).reduceLeft(_ || _)
)
Slick会将其转换为Sql LIKE
表达式。