我的数据库中有以下列,即布尔值,但也接受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 回答
Fist检查列是否为空,然后继续进行另一次比较 . 确保
rtbFromClient
不是一个选项 .第一个条件确保过滤空值,第二个条件检查值,以防列值不为空 .
如果您有可选值,则下面的代码有帮助 .
更清洁的版本在这里 .
rtbFromClient
用户给出可选值以与光滑列进行比较 .试试这个