按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,一切都很好!
你可以这样做:
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
| 归档时间: |
|
| 查看次数: |
7095 次 |
| 最近记录: |