【问题标题】:Dynamic OR filtering - Slick动态 OR 过滤 - Slick
【发布时间】:2015-03-26 02:42:37
【问题描述】:

好的,我有一个带有多个像这样的可选参数的方法

def(username: Option[String], petname: Option[String], favouritefood: Option[String])

我想编写一个动态查询,它能够以这种方式获取已定义参数的数据

select * from table where un like username or pn like pn or ff like ff;

那么取决于定义了哪些参数以将它们添加到使用 OR 运算符进行查询?

【问题讨论】:

  • 或许,你可以试试这个博客。 davidruescas.com/2013/12/27/…
  • 我认为你需要这样做stackoverflow.com/questions/26815913/…
  • 已经检查过它们,但这不适用于可选值,因为在进行查询时我无法检查它们是否在 for-comprehension 中定义
  • 你想生成一个sql字符串吗?还是进行流畅的 api 调用?
  • id 想作为 api 调用来做

标签: scala slick scalaquery


【解决方案1】:

这样的事情应该可以工作。我不得不在自己的代码中使用类似的片段,它也接近于 cvogt 在上述评论中提出的建议(我认为)。

val username = Option("")
val petname = Option("")
val ff:Option[String] = None

val default = LiteralColumn(1) === LiteralColumn(1) 

yourTable.filter { it => 
  List(
      username.map(it.username === _),
      petname.map(it.petname === _),
      ff.map(it.ff === _)
  ).collect({case Some(it)  => it}).reduceLeftOption(_ || _).getOrElse(default)
}

【讨论】:

  • 是的,它很好用 :) 现在我还需要 4 个可选值之类的东西,并构建一个查询,该查询将在 where 条件中仅包含已定义的那些,不会检查列中是否存在未定义值,例如 @ 987654322@ def(a1: Option[String], a2: Option[String], a3: Option[String]) code a1 - Some("safe") code a2 - Some("unsafe") code a3 - 无 code select * from table where column like a1 或 column like a2 忽略 where 子句中未定义的那些
  • 我修改了我的答案。如果您在None 上使用map,则此值将保持为None。最后,您可以简单地过滤定义的值。
  • 谢谢,效果很好,我只需要在最后一个过滤器之后将其映射到 _.get 以减少选项换行 :)
  • 问题回答了吗? ;)
  • 我更新了我的答案,请参阅 Sebastien Lorber 的答案并首先评论原因。我认为你也应该更新你的代码。
【解决方案2】:

thoefer 非常适合简单的用例,但有一些限制。就像如果你所有的选项都没有,那么列表是空的,你不能减少一个空列表:)

如果您需要基于谓词、连词和析取(有点像 Hibernate/JPA Criteria API)的更可组合的东西,您可以在 Slick: create query conjunctions/disjunctions dynamically 中查看我的答案

【讨论】:

  • 我更新了我的答案以处理一个空列表。在这种特定情况下,可以将reduceLeftOptiongetOrElse 结合使用。
猜你喜欢
  • 2011-04-12
  • 2020-04-19
  • 1970-01-01
  • 2022-07-14
  • 2015-03-25
  • 1970-01-01
  • 2014-12-20
  • 2010-10-25
相关资源
最近更新 更多