【发布时间】:2018-03-24 04:49:36
【问题描述】:
我的数据库中有以下列,这是一个布尔值,但也接受 NULL,所以 true、false 和 NULL 都是有效的:
def rtb = column[Option[Boolean]]("rtb")
并从我想过滤的客户端获得以下可选输入:
rtbFromClient: Option[Boolean] = ...
我有以下内容(基于this answer on how to do queries in slick: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(无)但这些都不起作用)
还尝试了以下方法:
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
总结一下:
- 我的数据库中有一个 Option[Boolean] 列,它可以包含 true、false 或 NULL(实际的 mysql 类型是 tinyint(1),它映射到一个光滑的 Option[Boolean])
- 我有一个用户提供的可选过滤器 rtbFromClient,如果存在我想对其进行过滤。如果存在,这将是真或假
- 我有其他可选过滤器(此处未显示)具有类似行为,因此我希望能够轻松组合它们
【问题讨论】: