[英]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.