Scala 动态查询条件Slick 3.0
我试图筛选一个带有可选参数的表。在slick 2.1中,这是可行的,但当我转到3.0版时,错误是:调用函数“reduce”时,“无法解析符号&&” 如蒙帮助,我将不胜感激。。多谢各位 代码如下:Scala 动态查询条件Slick 3.0,scala,filtering,slick-3.0,Scala,Filtering,Slick 3.0,我试图筛选一个带有可选参数的表。在slick 2.1中,这是可行的,但当我转到3.0版时,错误是:调用函数“reduce”时,“无法解析符号&&” 如蒙帮助,我将不胜感激。。多谢各位 代码如下: def getAll(params : ClienteSearchParameters) : DBIOAction[Iterable[Cliente], NoStream, Effect.Read] = { val q = for { (x, (y, z)) <- t
def getAll(params : ClienteSearchParameters) : DBIOAction[Iterable[Cliente], NoStream, Effect.Read] = {
val q = for {
(x, (y, z)) <- tabla join (tablaPersonas joinLeft tablaContactos on (_.id === _.idPersona)) on (_.idPersona === _._1.id)
if {
List(
params.nombre.map(y.nombre === _),
params.apellido.map(y.apellido === _),
params.fechaAlta.map(x.fechaAlta === _),
params.fechaRegistracion.map(x.fechaRegistracion === _)
).flatten match {
case Nil => LiteralColumn[Boolean](true)
case seq => seq.reduce(_ && _)
}
}
} yield (x, y, z)
def getAll(params:clientSearchParameters):DBIOAction[Iterable[Cliente],NoStream,Effect.Read]={
val q=用于{
(x,(y,z))文字列[布尔值](真)
案例顺序=>顺序减少(&&)
}
}
}收益率(x,y,z)
这是来自doc的信息
我想你可以在这里找到你想要的。文档中的示例:
//building criteria using a "dynamic filter" e.g. from a webform.
val criteriaColombian = Option("Colombian")
val criteriaEspresso = Option("Espresso")
val criteriaRoast:Option[String] = None
val q4 = coffees.filter { coffee =>
List(
criteriaColombian.map(coffee.name === _),
criteriaEspresso.map(coffee.name === _),
criteriaRoast.map(coffee.name === _) // not a condition as `criteriaRoast` evaluates to `None`
).collect({case Some(criteria) => criteria}).reduceLeftOption(_ || _).getOrElse(true:Column[Boolean])
}
我发现了错误,两种解决方案都有效,问题是“y.apellido”和“x.fechaAlta”都是colums选项,那么符号&没有找到。如果我使用“getOrElse”方法,它工作得很好,但不确定它是否是最好的方法..您可以尝试这样的方法:params.apellido.flatMap(v=>y.apellido.map(v==y)),嗨,igor,这不起作用。。。。我也尝试过使用:params.apellido.map(v=>y.apellido.map(v===)。。。但是我得到了一个选项[Rep[Option[Boolean]]]。。。这应该是一个选项[Rep[Boolean]]。。然后我得到了一些错误。。。“无法解析符号&&”我可以解决它!执行以下操作:params.apellido.map(x=>persona.apellido.map(==x).getOrElse(false))@JuanPabloVittori上一个解决方案可以生成样板SQL代码,如:
where(case-when((x2.
order`为null)然后null-else(x2.order
=20)end)然后true-else(case-when(x2.订单
为空)然后为空(x2.订单
=20)结束)`