【问题标题】:Slick - Parameters are ignored in a Query TemplateSlick - 查询模板中的参数被忽略
【发布时间】:2013-11-14 16:18:31
【问题描述】:

我正在尝试为此编写一个查询模板:

val byIdentifier = for {
  (identifier, issuer) <- Parameters[(String, String)]
  o <- Objects if (o.identifier === identifier) && (o.identifierIssuer === issuer)
} yield o

然后像这样使用它:

def findByIdentifier(id: String, issuer: String): Option[Object] = 
  byIdentifier(id, issuer).firstOption

Objects 是一个提升嵌入的表:

case class Object(val identifer: String, val identifierIssuer: String)

object Objects extends Table[Object]("objects") {
  def identifier = column[String]("identifier")
  def identifierIssuer = column[String]("identifier_issuer")
  ...
}

我遇到的问题是findByIdentifier("asdf", "weqr") 生成一个带有where 子句的查询,它只是false

select ... from "objects" where false

为了进行正确的查询,我的查询模板中缺少什么?

【问题讨论】:

  • 这可能会或可能不会有所作为。您是否尝试过在过滤条件中使用is 而不是===

标签: sql postgresql scala parameters slick


【解决方案1】:

试试下面的语法:

val byIdentifier = for {
  (identifier, issuer) <- Parameters[(String, String)]
  o <- Objects
  if o.identifier === identifier
  if o.identifierIssuer === issuer
} yield o

我经常发现 slick 的语法有点不靠谱,而且当前的文档也不是特别好。

您也可以让您的 findByIdentifier 完成这项工作:

def findByIdentifier(id: String, issuer: String): Option[Object] = {
    Query(Object).where(_.identifier === id).where(_.identifierIssuer === issuer).run.headOption
}

希望对你有帮助……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2015-05-13
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多