好的,我有一个带有多个可选参数的方法,比如这个
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运算符查询?
答案 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
中查看我的答案