首页 文章

如何在光滑中过滤Option [Boolean]列

提问于
浏览
4

我的数据库中有以下列,即布尔值,但也接受NULL,因此true,false和NULL都是有效的:

def rtb = column[Option[Boolean]]("rtb")

并从我希望过滤的客户端输入以下可选输入:

rtbFromClient: Option[Boolean] = ...

我有以下内容(基于这个关于如何在光滑中进行查询的答案:https://stackoverflow.com/a/40888918/5300930):

val query = userTable.
      filter(row => 
          if (rtbFromClient.isDefined) 
              row.rtb.get === rtbFromClient.get 
          else 
              LiteralColumn(true)
      )

但是代码运行时出现此错误:

Caught exception while computing default value for Rep[Option[_]].getOrElse -- This cannot be done lazily when the value is needed on the database side

我认为这可能是因为row.rtb.get在调用get时抛出异常因为db中的值为null,所以尝试将其更改为row.rtb.getOrElse(null)和row.rtb.getOrElse(None)但是这些都不起作用)

还尝试了以下内容:

if (rtbFromClient.isDefined) {
    val query = query.filter(_.rtb.isDefined).filter(_.rtb.get === rtbFromClient.get)
}

但是这也会在运行时抛出相同的错误:

Caught exception while computing default value for Rep[Option[_]].getOrElse -- This cannot be done lazily when the value is needed on the database side

总结一下:

  • 我的db中有一个Option [Boolean]列,可以包含true,false或NULL(实际的mysql类型是一个tinyint(1),它被映射到一个光滑的Option [Boolean])

  • 我有一个由用户提供的可选过滤器,rtbFromClient,如果存在,我想过滤它 . 如果存在,这将是真或假

  • 我有其他类似行为的可选过滤器(此处未显示),因此我希望能够轻松地将它们组合起来

3 回答

  • 2

    Fist检查列是否为空,然后继续进行另一次比较 . 确保 rtbFromClient 不是一个选项 .

    val query = userTable.filter(row => !row.rtb.isEmpty &&
                                        row.rtb === rtbFromClient)
    

    第一个条件确保过滤空值,第二个条件检查值,以防列值不为空 .

    如果您有可选值,则下面的代码有帮助 .

    def query(value: Option[Boolean]) = value match {
       case Some(userGivenRtbFromClient) =>
        userTable.filter(row => !row.rtbFromClient.isNull &&
             row.rtbFromClient === userGivenRtbFromClient)
       case None => userTable.filter(row => row.rtbFromClient.isNull)
    }
    

    更清洁的版本在这里 .

    rtbFromClient: Option[Boolean]
    

    rtbFromClient 用户给出可选值以与光滑列进行比较 .

    userTable.filter(row => rtbFromClient.map(value => row.rtb === Some(value): Option[Boolean]).getOrElse(row.rtb.isEmpty))
    
  • 0
    var query = userTable.drop(page.skip).take(page.top)
    
    if (rtbFromClient.isDefined) {
        query = query.filter(row => row.rtb.isDefined && row.rtb === rtbFromClient)
    }
    
    // More if blocks with optional filters here
    ...
    
    dbProvider.db.run(query.result)
    
  • 0

    试试这个

    val query = userTable.filter(row => rtbFromClient.map(x => Option(x) === row.rtb).getOrElse(row.rtb.isEmpty.?))
    

相关问题