Scala 动态查询条件Slick 3.0

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

我试图筛选一个带有可选参数的表。在slick 2.1中,这是可行的,但当我转到3.0版时,错误是:调用函数“reduce”时,“无法解析符号&&”

如蒙帮助,我将不胜感激。。多谢各位

代码如下:

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)结束)`