【问题标题】:Slick dynamic optional query or OR filter灵活的动态可选查询或 OR 过滤器
【发布时间】:2015-03-25 20:06:01
【问题描述】:

我有一个几天都无法解决的问题,

我想根据我的可选值进行动态查询。如果定义了一个值,我想查询选择的结果,否则给我*投影表。 由于无法将 Lift Embedding DSL 与普通的 Scala 代码混合起来进行理解,有没有其他方法可以实现这一点?

val x: Option[String] = Some("John")

看起来像或做某事的东西

val result = for {
   w <- workers if (x.isDefined) w.name === x else * projection 
}

另外,有没有一种可能的方法来编写一个具有可选参数的函数并将它们链接到将在 WHERE 子句 OR 条件中产生的查询中?对于 OPTIONAL 参数的动态数量,我已经设法使用 MaybeFilter 做到这一点,但仅适用于 AND 条件。

case class MaybeFilter[X, Y](val query: scala.slick.lifted.Query[X, Y, Seq])     {
  def filteredBy(op: Option[_])(f: (X) => Column[Option[Boolean]]) = {
    op map { o => MaybeFilter(query.filter(f)) } getOrElse { this }
  }
}

implicit def maybeFilterConversor[X, Y](q: Query[X, Y, Seq]) = new MaybeFilter(q)

val x: Option[String] = Some("Ana")
val y: Option[String] = Some("Lemic")

val result = for { r <- radnik.filteredBy(x)(_.ime === x).filteredBy(y)(_.prz === y).query } yield r

prints out select x2.`Mbr`, x2.`Ime`, x2.`Prz`, x2.`Sef`, x2.`Plt`, x2.`Pre`, x2.`God` from `radnik` x2 where (x2.`Ime` = 'Ana') and (x2.`Prz` = 'Lemic')

我需要一个函数,它可以链接任意数量的可选条件,例如过滤条件,但这会产生一个 OR 过滤器绑定到它以实现类似

select x2.`Mbr`, x2.`Ime`, x2.`Prz`, x2.`Sef`, x2.`Plt`, x2.`Pre`, x2.`God` from `radnik` x2 where (x2.`Ime` = 'Ana') or (x2.`Prz` = Lemic') or (x2.`God` >= '1950')

like filtersBy(someth).orFilteredBy(someth).filteredBy(someth)

提前致谢。

【问题讨论】:

    标签: scala slick scalaquery


    【解决方案1】:

    如官方documentation所示,您可以像这样构建动态过滤条件:

    val x: Option[String] = Some("Ana")
    val y: Option[String] = Some("Lemic")
    
    val result = radnik.filter { r =>
      List(
          x.map(radnik.ime === _),
          y.map(radnik.prz === _)
      ).collect({case Some(criteria)  => criteria}).reduceLeftOption(_ || _).getOrElse(true: Rep[Boolean])
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-07
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2011-06-25
      相关资源
      最近更新 更多