【问题标题】:How to use LIKE operator in Slick?如何在 Slick 中使用 LIKE 运算符?
【发布时间】:2021-03-01 10:06:48
【问题描述】:

我正在尝试使用Slick 框架与MySQL 集成。但是,每当我使用 LIKE 运算符时,它都会失败并出现错误,如下所示。

代码

.filterIf(etilizeRequest.q.nonEmpty) {
    case ((((((prod, manRep), catRep), cnRep), pdRep), prodSkusRep), saRep) =>
        cnRep.map(_.name).like("%"+etilizeRequest.q.get+"%").get
}

错误

slick.SlickException:在计算默认值时捕获异常 for Rep[Option[_]].getOrElse -- 当 数据库端需要值 slick.compiler.HoistClientOps$$anonfun$rewriteDBSide$1.applyOrElse(HoistClientOps.scala:159) 在 slick.compiler.HoistClientOps$$anonfun$rewriteDBSide$1.applyOrElse(HoistClientOps.scala:152) 在 slick.ast.NodeOps$.r$1(Util.scala:47) 在 slick.ast.NodeOps$.$anonfun$replace$2(Util.scala:48) 在 slick.ast.BinaryNode.mapChildren(Node.scala:204) 在 slick.ast.BinaryNode.mapChildren$(Node.scala:200) 在 slick.ast.Filter.mapChildren(Node.scala:310) 在 slick.ast.NodeOps$.g$1(Util.scala:48) 在 slick.ast.NodeOps$.r$1(Util.scala:47) 在 slick.ast.NodeOps$.$anonfun$replace$2(Util.scala:48) 原因: slick.SlickException:读取列的 NULL 值 slick.lifted.OptionColumnExtensionMethods@594b5a63 在 slick.lifted.OptionColumnExtensionMethods$.$anonfun$get$1(ExtensionMethods.scala:39) 在 slick.compiler.HoistClientOps$$anonfun$rewriteDBSide$1.applyOrElse(HoistClientOps.scala:156) 在 slick.compiler.HoistClientOps$$anonfun$rewriteDBSide$1.applyOrElse(HoistClientOps.scala:152) 在 slick.ast.NodeOps$.r$1(Util.scala:47) 在 slick.ast.NodeOps$.$anonfun$replace$2(Util.scala:48) 在 slick.ast.BinaryNode.mapChildren(Node.scala:204) 在 slick.ast.BinaryNode.mapChildren$(Node.scala:200) 在 slick.ast.Filter.mapChildren(Node.scala:310) 在 slick.ast.NodeOps$.g$1(Util.scala:48) 在 slick.ast.NodeOps$.r$1(Util.scala:47)

有人能建议这个错误背后的原因吗?我该如何解决?

【问题讨论】:

    标签: mysql scala slick


    【解决方案1】:

    .get 发生在 SQL 级别时,Slick 不能总是在 Option 上调用 .get。我不清楚这种情况何时发生,但在你的例子中,我猜这将是最后的.get。我认为这是因为我们会在数据库级别要求将可选的like 表达式转换为 SQL。我认为这是不可能的。

    在您的情况下,可以将可选列转换为字符串列:

    cnRep.map(_.name).asColumnOf[String].like(...etc...)
    

    ...您可以省略最后的.get 调用。 (我实际上认为 Slick 3.3 中添加了对此的自动支持,但我猜不是)。

    您也可以使用filterOpt 而不是filterIf。这将从您的LIKE 表达式中再删除一个getSection 2.9 of Essential Slick 给出了一些例子。

    【讨论】:

      猜你喜欢
      • 2013-01-19
      • 2020-09-21
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多