好的,我有一个方法,有多个这样的可选参数
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运算符查询?
这样的事情应该有效 . 我不得不在我自己的代码中使用类似的片段,它也接近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) }
对于简单的用例而言,这个问题很好但有一些限制 . 就像所有选项都是None一样,列表为空,你不能减少空列表:)
如果你需要一些更可组合的东西,基于谓词,连词和析取(有点像Hibernate / JPA Criteria API),你可以在Slick: create query conjunctions/disjunctions dynamically查看我的答案
2 回答
这样的事情应该有效 . 我不得不在我自己的代码中使用类似的片段,它也接近cvogt在上面评论中提出的内容(我认为) .
对于简单的用例而言,这个问题很好但有一些限制 . 就像所有选项都是None一样,列表为空,你不能减少空列表:)
如果你需要一些更可组合的东西,基于谓词,连词和析取(有点像Hibernate / JPA Criteria API),你可以在Slick: create query conjunctions/disjunctions dynamically查看我的答案