首页 > 解决方案 > 类似条件的光滑列表映射

问题描述

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

column
------
a
ab
abc
b
bc
bca
c
cba

我有一个列表 = [a, b, bc],我想要从列表中的任何元素开始的表中的所有行。

column
------
a
ab
abc
b
bc
bca

我如何使用 slick 形成 queryCondition:

table = TableQuery[Table]

mapping  = list map
        {
          value =>
            table.column like value + "%"
        }

标签: scalaslickscala-collectionsslick-3.0

解决方案


据我了解,您需要以下形式的查询:

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%'
)

所以现在的问题是如何LIKE从 Scala 列表中构造这些部分。

标准集合库有几种方法可以做到这一点。这是一个(reduceLeft):

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

我们正在做的是:

  • 将列表patterns转换为 Slicklike表达式列表
  • 然后将 Slick 表达式列表与||
  • 这给了我们一个在 a 中使用的 Slick 表达式(likes 与 结合orfilter

代替like,您还可以使用startsWith避免必须添加%到您的字符串列表中:

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

Slick 会将其转换为 SqlLIKE表达式。


推荐阅读