动态OR过滤 - 光滑

时间:2015-01-27 13:05:06

标签: scala slick scalaquery

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

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运算符查询?

2 个答案:

答案 0 :(得分:6)

这样的事情应该有效。我不得不在我自己的代码中使用类似的片段,它也接近vogt在上面评论中提出的内容(我认为)。

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)
}

答案 1 :(得分:1)

对于简单的用例来说,这个方法很好但有一些限制。就像所有选项都是None一样,列表为空,你不能减少空列表:)

如果你需要一些更可组合的东西,基于谓词,连词和析取(有点像Hibernate / JPA Criteria API),你可以在Slick: create query conjunctions/disjunctions dynamically

中查看我的答案