我正在尝试使用框架与MySQL集成。但是,每当我像使用一样使用运算符时,它就会失败,错误如下所示。
码
.filterIf(etilizeRequest.q.nonEmpty) {
case ((((((prod, manRep), catRep), cnRep), pdRep), prodSkusRep), saRep) =>
cnRep.map(_.name).like("%"+etilizeRequest.q.get+"%").get
}
误差
slick.compiler.HoistClientOps$$anonfun$rewriteDBSide$1.applyOrElse(HoistClientOps.scala:159) slick.SlickException:在计算Rep[Option_].getOrElse的默认值时遇到异常--当数据库端需要该值时,不能懒洋洋地执行。slick.ast.NodeOps$.$anonfun$replace$2(Util.scala:48)的.BinaryNode.mapChildren$(Node.scala:200) at slick.ast.Filter.mapChildren(Node.scala:310) at slick.ast.NodeOps$.g$1(Util.scala:48) at slick.ast.NodeOps$.r$1(Util.scala:47)slick.compiler.HoistClientOps$$anonfun$rewriteDBSide$1.applyOrElse(HoistClientOps.scala:152) at slick.ast.NodeOps$.r$1(Util.scala:47)在slick.ast.NodeOps$.$anonfun$replace$2(Util.scala:48) at slick.ast.BinaryNode.mapChildren(Node.scala:204) at slick.ast.BinaryNode.mapChildren$(Node.scala:200) at slick.ast.Filter.mapChildren(Node.scala:310) at slick.ast.NodeOps$.g$1(Util.scala:48)在slick.ast.NodeOps$.r$1(Util.scala:47)
有人能提出这个错误背后的原因吗?我该如何解决呢?
发布于 2020-11-18 01:35:57
当.get
发生在SQL级别时,Slick不能总是在Option
上调用.get
。我不清楚这是什么时候发生的,但在您的示例中,我猜这将是最终的.get
。我认为这是因为在数据库级别上,我们会要求将可选的like
表达式转换为SQL。我觉得这不可能。
在您的示例中,需要将可选列转换为字符串列:
cnRep.map(_.name).asColumnOf[String].like(...etc...)
...and,您可以省略最后的.get
调用。(我实际上以为Slick 3.3中增加了对此的自动支持,但我想并非如此)。
您还可以使用filterOpt
而不是filterIf
。这将从您的get
表达式中再删除一个LIKE
。Section 2.9 of 给出了一些例子。
https://stackoverflow.com/questions/64888000
复制相似问题