gpt4 book ai didi

scala - 使用 Slick 3 的带有可选 where 子句的动态查询

转载 作者:行者123 更新时间:2023-12-01 22:16:47 25 4
gpt4 key购买 nike

我正在尝试实现一种方法来返回过滤结果,该方法基于一组可能设置也可能未设置的参数。似乎不可能有条件地链接多个过滤器,即从一个过滤器开始......

val slickFlights = TableQuery[Flights]
val query = slickFlights.filter(_.departureLocation === params("departureLocation").toString)

有条件地向查询添加另一个过滤器(如果它存在于参数映射中)似乎不起作用...

if (params.contains("arrivalLocation")) {
query.filter(_.arrivalLocation === params("arrivalLocation").toString)
}

可以通过其他方式使用 Slick 来完成这种条件过滤吗?

我遇到了 MaybeFilter:https://gist.github.com/cvogt/9193220 ,这似乎是处理这个问题的一个不错的方法。然而它似乎不适用于 Slick 3.x

根据下面 Hüseyin 的建议,我还尝试了以下方法:

def search(departureLocation: Option[String], arrivalLocation: Option[String]) = {
val query = slickFlights.filter(flight =>
departureLocation.map {
param => param === flight.departureLocation
})

其中slickFlights是一个TableQuery对象val slickFlights = TableQuery[Flights]。然而,这会产生以下编译错误:

value === is not a member of String

Intellij 还提示 === 是一个未知符号。也不适用于 ==。

最佳答案

一种无需理解的简单方法:

import slick.lifted.LiteralColumn

val depLocOpt = Option[Long]
val slickFlights = TableQuery[Flights]
val query = slickFlights.filter { sf =>
if (depLocOpt.isDefined) sf.departureLocation === depLocOpt.get
else LiteralColumn(true)
}

更新:您可以使用fold进一步缩短它:

val depLocOpt = Option[Long]
val slickFlights = TableQuery[Flights]
val query = slickFlights.filter { sf =>
depLocOpt.fold(true.bind)(sf.departureLocation === _)
}

关于scala - 使用 Slick 3 的带有可选 where 子句的动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36246763/

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