我有以下案例类的列表
case class caseClass
(
field1: Option[String],
field2: Option[String],
field3: Option[String]
)这些字段对应于我要搜索的mySQL表的列。基本上,我希望对每个case类实例进行筛选,其中在field1、field2和field3之间有一个和关系,在实例之间有一个OR关系。在SQL中,如下所示:
SELECT
field4,
field5
FROM
tablename
WHERE
(field1 = ? AND field2 = ?) OR
(field3 = ?) OR
(field1 = ? AND field2 = ? AND field3 = ?) OR
...etc当然,它将通过字符串连接生成,因为所有case类字段都是可选的。我如何巧妙地解决这个问题(而不是使用slick的普通SQL查询)?
发布于 2017-03-31 11:10:13
我们提出了基于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[OptionBoolean]表达式(这是元组的第一部分)进行筛选,所以我认为我把这个列表作为一个元组列表,其中第二个部分是CaseClass的参数。而且很容易过滤普通选项。
https://stackoverflow.com/questions/43124261
复制相似问题