[英]How to use LIKE operator in Slick?
我正在嘗試使用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:在計算 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: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)
有人可以提出這個錯誤背后的原因,我該如何解決?
當.get
在 SQL 級別發生時,Slick 不能總是在Option
上調用.get
。 我不清楚何時發生這種情況,但在您的示例中,我猜這將是最后的.get
。 我認為這是因為我們會要求在數據庫級別將可選的like
表達式轉換為 SQL。 我不認為那是可能的。
在您的情況下,有一種解決方法可以將可選列轉換為字符串列:
cnRep.map(_.name).asColumnOf[String].like(...etc...)
...你可以省略最后的.get
調用。 (我實際上認為在 Slick 3.3 中添加了對此的自動支持,但我想不是)。
您也可以使用filterOpt
而不是filterIf
。 這將從您的LIKE
表達式中再刪除一個get
。 Essential Slick 的第 2.9 節給出了一些示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.