首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用slick 3.2 scala中的ADT列表进行筛选

问如何使用slick 3.2 scala中的ADT列表进行筛选
EN

Stack Overflow用户
提问于 2017-03-30 17:10:08
回答 1查看 100关注 0票数 1

我有以下案例类的列表

代码语言:javascript
复制
case class caseClass
(
  field1: Option[String],
  field2: Option[String],
  field3: Option[String]
)

这些字段对应于我要搜索的mySQL表的列。基本上,我希望对每个case类实例进行筛选,其中在field1、field2和field3之间有一个和关系,在实例之间有一个OR关系。在SQL中,如下所示:

代码语言:javascript
复制
SELECT
    field4,
    field5
FROM
    tablename
WHERE
    (field1 = ? AND field2 = ?) OR
    (field3 = ?) OR 
    (field1 = ? AND field2 = ? AND field3 = ?) OR 
    ...etc

当然,它将通过字符串连接生成,因为所有case类字段都是可选的。我如何巧妙地解决这个问题(而不是使用slick的普通SQL查询)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-31 11:10:13

我们提出了基于this answer的解决这个问题的方法。

代码语言:javascript
复制
def queryGenerator
(
  listOfCaseClasses: List[CaseClass],
  table: TableQuery[CaseClassvTable]
) = {
  val query = table.filter { row =>
    listOfCaseClasses.map { parameter =>
      List(
        (row.field1vTable === parameter.field1, parameter.field1),
        (row.field2vTable === parameter.field2, parameter.field2),
        (row.field3vTable === parameter.field3, parameter.field3),
      ).collect{ case (x, Some(_)) => x }.reduce(_ && _)
    }.reduce(_ || _)
  }.result
  query
}

我不知道如何基于Rep[OptionBoolean]表达式(这是元组的第一部分)进行筛选,所以我认为我把这个列表作为一个元组列表,其中第二个部分是CaseClass的参数。而且很容易过滤普通选项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43124261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档