类似条件的光滑列表映射

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 表达式(likes 与 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 表达式。