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

问题描述

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

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

您也可以使用like代替startsWith,以避免将%添加到字符串列表中:

val patterns = Seq("a","bc")
val query = table.filter(row => 
 patterns.map(pattern => row.column startsWith pattern).reduceLeft(_ || _)
)

Slick会将其转换为Sql LIKE表达式。