类似条件的光滑列表映射
Slick list mappings for like condition
我有一个 table,其中有一列的值为:
column
------
a
ab
abc
b
bc
bca
c
cba
我有一个列表 = [a, b, bc],我想要从列表中的任何元素开始的 table 中的所有行。
column
------
a
ab
abc
b
bc
bca
如何使用 slick 形成 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 List 构造 LIKE
部分。
标准集合库有几种方法可以做到这一点。这是一个 (reduceLeft
):
val patterns = Seq("a", "b", "bc").map(_ + "%")
val query = table.filter(row =>
patterns.map(pattern => row.column like pattern).reduceLeft(_ || _)
)
我们正在做的是:
- 将
patterns
的列表变成 Slick like
表达式的列表
- 然后将 Slick 表达式列表与
||
合并
- 这给了我们一个 Slick 表达式(
like
s 与 or
组合)在 filter
. 中使用
除了 like
,您还可以使用 startsWith
来避免必须将 %
添加到您的字符串列表中:
val patterns = Seq("a", "b", "bc")
val query = table.filter(row =>
patterns.map(pattern => row.column startsWith pattern).reduceLeft(_ || _)
)
Slick 会将其转换为 Sql LIKE
表达式。
我有一个 table,其中有一列的值为:
column
------
a
ab
abc
b
bc
bca
c
cba
我有一个列表 = [a, b, bc],我想要从列表中的任何元素开始的 table 中的所有行。
column
------
a
ab
abc
b
bc
bca
如何使用 slick 形成 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 List 构造 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
s 与or
组合)在filter
. 中使用
除了 like
,您还可以使用 startsWith
来避免必须将 %
添加到您的字符串列表中:
val patterns = Seq("a", "b", "bc")
val query = table.filter(row =>
patterns.map(pattern => row.column startsWith pattern).reduceLeft(_ || _)
)
Slick 会将其转换为 Sql LIKE
表达式。