9

通过 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
}

我觉得得到一份清单然后拿走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 _)

  ...
}

有没有更简单的方法可以使用 Slick 从 ID 中获取 Option[T] ?

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

4

3 回答 3

9

你可以这样做:

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

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

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

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

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

于 2013-07-18T14:00:12.530 回答
4

首先,您可以尝试使用相同代码的脱糖版本:

Category.filter{ _.id === id }.list.headOption

看起来干净多了。

您也可以使用 firstOption 方法:

Category.filter{ _.id === id }.firstOption
于 2013-07-18T13:54:28.787 回答
0

我将 slick 1.0.1 与 Play 2.2.1 一起使用,以下对我有用。

val byId = createFinderBy(_.id)

然后从方法中调用它。

  def findById(id: Int): Option[Category] = DB.withSession { implicit session =>
    Category.byId(id).firstOption
  }

请注意,DB.withSession 是 play 框架中的一个方法。

如果您不使用 Play,方法如下所示。

  def findById(id: Int)(implicit session: Session): Option[Category] = {
    Category.byId(id).firstOption
  }
于 2015-05-22T06:40:44.437 回答