光滑选择按行标记

dam*_*ian 9 scala slick

按id选择一行应该是一件简单的事情,但我在弄清楚如何将它映射到我的对象时遇到了一些麻烦.

我发现这个问题正在寻找同样的事情,但给出的答案对我不起作用.

目前我有这个工作,但它似乎并不像它应该的那样优雅.

def getSingle(id: Long):Option[Category] = withSession{implicit session =>
 (for{cat <- Category if cat.id === id} yield cat ).list.headOption
 //remove the .list.headOption and the function will return a WrappingQuery
}
Run Code Online (Sandbox Code Playgroud)

我觉得得到一个列表然后采取headOption是笨重和不必要的.我肯定错过了什么.

如果有帮助,这里有更多我的类别代码

case class Category(
  id: Long = 0L,
  name: String
)
object Category extends Table[Category]("categories"){

  def name = column[String]("name", O.NotNull)
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

  def * = id ~ name <> (Category.apply _, Category.unapply _)

  ...
}
Run Code Online (Sandbox Code Playgroud)

是否有更简单的方法来使用Slick从ID获取Option [T]?

解决方案存在驱动程序问题.我无法使用,.firstOption但升级到mysql jdbc 5.1.25,一切都很好!

Nil*_*jan 9

你可以这样做:

def getSingle(id: Long):Option[Category] = withSession{implicit session =>
 Query(Category).where(_.id === id).firstOption 
}
Run Code Online (Sandbox Code Playgroud)

如果您经常使用此查询,那么您应该考虑QueryTemplate:

val byId = t.createFinderBy( t => t.id )

这将创建一个预编译的预准备语句,您可以在方法中使用它

def getSingle(id: Long):Option[Category] = byId(id).firstOption

  • 可能是司机问题.看看http://stackoverflow.com/questions/15113707/error-code-1064-sql-state-42000-you-have-an-error-in-your-sql-syntax (3认同)
  • 更新为"mysql"%"mysql-connector-java"%"5.1.25"`.工作得很好,谢谢! (2认同)