简体   繁体   English

如何在 Slick 中使用 LIKE 运算符?

[英]How to use LIKE operator in Slick?

I am trying to use Slick framework for integration with MySQL .我正在尝试使用Slick框架与MySQL集成。 However whenever I use LIKE operator it fails with the error, as shown below.但是,每当我使用LIKE运算符时,它都会失败并显示错误,如下所示。

Code代码

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

Error错误

slick.SlickException: Caught exception while computing default value for Rep[Option[_]].getOrElse -- This cannot be done lazily when the value is needed on the database side at slick.compiler.HoistClientOps$$anonfun$rewriteDBSide$1.applyOrElse(HoistClientOps.scala:159) at slick.compiler.HoistClientOps$$anonfun$rewriteDBSide$1.applyOrElse(HoistClientOps.scala:152) at slick.ast.NodeOps$.r$1(Util.scala:47) at 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) at slick.ast.NodeOps$.r$1(Util.scala:47) at slick.ast.NodeOps$.$anonfun$replace$2(Util.scala:48) Caused by: slick.SlickException: Read NULL value for column slick.lifted.OptionColumnExtensionMethods@594b5a63 at slick.lifted.OptionColumnExtensionMethods$.$anonfun$get$1(ExtensionMethods.scala:39) at slick.compiler.HoistClientOps$$anonfun$rewri slick.SlickException:在计算 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) at slick.ast.BinaryNode.mapChildren(Node.scala:204) at slick.ast.BinaryNode.mapChildren$(Node.scala:200) at 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:在 slick.lifted.OptionColumnExtensionMethods$.$anonfun$get$1(ExtensionMethods. scala:39) 在 slick.compiler.HoistClientOps$$anonfun$rewri teDBSide$1.applyOrElse(HoistClientOps.scala:156) at slick.compiler.HoistClientOps$$anonfun$rewriteDBSide$1.applyOrElse(HoistClientOps.scala:152) at slick.ast.NodeOps$.r$1(Util.scala:47) at 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) at slick.ast.NodeOps$.r$1(Util.scala:47) teDBSide$1.applyOrElse(HoistClientOps.scala:156) at slick.compiler.HoistClientOps$$anonfun$rewriteDBSide$1.applyOrElse(HoistClientOps.scala:152) at slick.ast.NodeOps$.r$1:4Util.scala 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)在 slick.ast.Filter.mapChildren(Node.scala:310) 在 slick.ast.NodeOps$.g$1(Util.scala:48) 在 slick.ast.NodeOps$.r$1(Util.scala:47)

Can someonw suggest the reasoning behind this error and how can I fix it ?有人可以提出这个错误背后的原因,我该如何解决?

Slick can't always call .get on an Option when the .get happens at the SQL level..get在 SQL 级别发生时,Slick 不能总是在Option上调用.get It's not clear to me when this happens, but in your example I'd guess it will be the final .get at the end.我不清楚何时发生这种情况,但在您的示例中,我猜这将是最后的.get I think that because we'd be asking, at the database level, to turn an optional like expression into SQL.我认为这是因为我们会要求在数据库级别将可选的like表达式转换为 SQL。 I don't think that's possible.我不认为那是可能的。

In your case there's a work around to convert an optional column to a string column:在您的情况下,有一种解决方法可以将可选列转换为字符串列:

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

...and you can omit the final .get call. ...你可以省略最后的.get调用。 (I actually thought automatic support for this was added in Slick 3.3, but I guess not). (我实际上认为在 Slick 3.3 中添加了对此的自动支持,但我想不是)。

You may also be able to use filterOpt rather than filterIf .您也可以使用filterOpt而不是filterIf That would remove one more get from inside your LIKE expression.这将从您的LIKE表达式中再删除一个get Section 2.9 of Essential Slick gives some examples. Essential Slick 的第 2.9 节给出了一些示例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM