如何使用 slick 3.2 在 scala 中使用 ADT 列表进行过滤
How to filter with a list of ADTs in scala with slick 3.2
我有以下案例的列表class
case class caseClass
(
field1: Option[String],
field2: Option[String],
field3: Option[String]
)
这些字段对应于 mySQL table 的列,我想在其中搜索。基本上我想过滤每个案例 class 实例,其中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
当然,它会通过字符串连接生成,因为所有大小写 class 字段都是可选的。
我怎样才能用 slick 优雅地解决这个问题(不使用 slick 的普通 SQL 查询)?
我们根据想出了解决这个问题的方法
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[_]。
我有以下案例的列表class
case class caseClass
(
field1: Option[String],
field2: Option[String],
field3: Option[String]
)
这些字段对应于 mySQL table 的列,我想在其中搜索。基本上我想过滤每个案例 class 实例,其中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
当然,它会通过字符串连接生成,因为所有大小写 class 字段都是可选的。 我怎样才能用 slick 优雅地解决这个问题(不使用 slick 的普通 SQL 查询)?
我们根据
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[_]。