gpt4 book ai didi

scala - 如何在 Option[Boolean] 列上进行筛选

转载 作者:行者123 更新时间:2023-12-03 21:25:06 25 4
gpt4 key购买 nike

我的数据库中有以下列,这是一个 bool 值,但也接受 NULL,因此 true、false 和 NULL 都是有效的:

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

并从我想过滤的客户端获得以下可选输入:
rtbFromClient: Option[Boolean] = ... 

我有以下内容(基于这个关于如何在 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 时抛出异常,因为数据库中的值为 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

总结一下:
  • 我的数据库中有一个 Option[Boolean] 列,它可以包含 true、false 或 NULL(实际的 mysql 类型是 tinyint(1),它映射到一个光滑的 Option[Boolean])
  • 我有一个由用户提供的可选过滤器 rtbFromClient,如果存在,我想对其进行过滤。如果存在,这将是 true 或 false
  • 我还有其他具有类似行为的可选过滤器(此处未显示),因此我希望能够轻松地将它们组合起来
  • 最佳答案

    我遇到过同样的问题。我的解决方案是(用 Slick 3.3.x 测试):

    val query = usersTable.filterOpt(rtbFromClient)(_.rtb === _)

    情况1(当rtbFromClient为空时)对应如下SQL:
    select * from users;

    情况2(定义了rtbFromClient):
    select * from users where rtb = ?;

    关于scala - 如何在 Option[Boolean] 列上进行筛选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46706386/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com