光滑的列表映射可满足类似条件

时间:2020-10-08 08:09:29

标签: scala slick scala-collections slick-3.0

我有一个表,其中的列包含值:

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 + "%"
        }

1 个答案:

答案 0 :(得分:1)

据我所知,您希望查询以下形式:

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的列表转换为Slick like表达式的列表
  • 然后将Slick表达式列表与||组合
  • 这为我们提供了一个Slick表达式(将likeor结合使用)在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表达式。