【问题标题】:Slick dynamically filter by a list of columns and valuesSlick 按列和值列表动态过滤
【发布时间】:2018-11-09 21:48:34
【问题描述】:

我正在尝试使用动态过滤在 slick 中创建一个查询。我有一个Seq[(String, String)],其中元组的第一个元素是列名,而第二个元素是过滤器的值。

在伪代码中,我想做这样的事情:

val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable) {
    case(query, (column, value)) => query.filter(select(column) === value)
}

我已经有一个函数def select(name: String): Rep[_],它从它的名字开始返回列Rep,效果很好,但我不知道如何获得制作===函数(或其他比较函数)所需的所有隐式) 工作。

有没有办法在 slick 中进行这样的动态过滤?

【问题讨论】:

  • 如果您尝试使用query.filter(x => check(x, column, value)) 方法,可能会更容易。

标签: scala slick


【解决方案1】:

是的!

我用这个方法

private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] = {
    operator match {
      case "==" => new BaseColumnExtensionMethods(left) === right
      case "!=" => new BaseColumnExtensionMethods(left) =!= right
      case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String
    }
  }

然后你可以写类似的东西

val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable) {
    case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))
}

【讨论】:

  • 我正在尝试实现这样的东西,你有完整的例子吗?
  • 好吧,完整的例子是我雇主的 IP ^^ 如果您有具体问题,请随时在 SO 上提问!要记住的一件事是,将 T 强制为 BaseTypedType 将有助于编写样板文件(并限制您可以搜索的内容,因此这是一种权衡!)
  • 在您的示例中,“right”被定义为“Rep[T]”,但 right 是值字符串。那么如何将值字符串转换为 Rep[String] ?据我了解线程示例,该值也定义为字符串参数?
  • @Raste 在 slick 中有一个隐式转换,所以你实际上不必担心它。
  • @C4stor,这真的很有帮助,谢谢。我们如何向这个函数添加 inSet 过滤器? inSet 接受一个 Iterable[T]。
猜你喜欢
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2019-04-01
  • 2015-11-08
  • 2014-12-20
相关资源
最近更新 更多