【问题标题】:How to filter with a list of ADTs in scala with slick 3.2如何使用 slick 3.2 在 scala 中使用 ADT 列表进行过滤
【发布时间】:2017-03-30 17:10:08
【问题描述】:

我有以下案例类的列表

case class caseClass
(
  field1: Option[String],
  field2: Option[String],
  field3: Option[String]
)

这些字段对应于我要搜索的 mySQL 表的列。基本上我想过滤每个案例类实例,其中 field1、field2 和 field3 之间存在 AND 关系以及 OR实例之间的关系。在 SQL 中会是这样的:

SELECT
    field4,
    field5
FROM
    tablename
WHERE
    (field1 = ? AND field2 = ?) OR
    (field3 = ?) OR 
    (field1 = ? AND field2 = ? AND field3 = ?) OR 
    ...etc

当然,它会通过字符串连接生成,因为所有案例类字段都是可选的。 我怎样才能优雅地用 slick 解决这个问题(不使用 slick 的普通 SQL 查询)?

【问题讨论】:

    标签: mysql scala slick


    【解决方案1】:

    我们根据this answer想出了如何解决这个问题

    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[Option[Boolean]] 表达式(这是元组的第一部分)进行过滤,所以我想我将列表设为第二部分的元组列表CaseClass 的参数。而且很容易过滤普通的 Option[_]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-09
      • 2015-08-09
      • 2021-08-08
      • 2019-08-22
      • 1970-01-01
      • 2017-05-16
      • 2012-12-31
      • 1970-01-01
      相关资源
      最近更新 更多