gpt4 book ai didi

mysql - 如何使用 slick 3.2 在 scala 中使用 ADT 列表进行过滤

转载 作者:行者123 更新时间:2023-11-30 22:01:51 25 4
gpt4 key购买 nike

我有以下案例类的列表

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 查询)?

最佳答案

我们根据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[_]。

关于mysql - 如何使用 slick 3.2 在 scala 中使用 ADT 列表进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43124261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com