首页 文章

动态OR过滤 - 光滑

提问于
浏览
1

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

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 回答

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

    对于简单的用例而言,这个问题很好但有一些限制 . 就像所有选项都是None一样,列表为空,你不能减少空列表:)

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

相关问题