光滑选择按行标记

时间:2013-07-18 13:31:14

标签: scala slick

按ID选择单行应该是一件简单的事情,但我在确定如何将其映射到我的对象时遇到了一些麻烦。

我发现this question正在寻找相同的东西,但给出的答案对我不起作用。

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

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并且一切都很好!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

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

看起来更干净。

您也可以使用firstOption方法:

Category.filter{ _.id === id }.firstOption

答案 2 :(得分:0)

我在Play 2.2.1中使用了光滑的1.0.1,以下内容适用于我。

alert()

然后从方法中调用它。

val byId = createFinderBy(_.id)

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

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

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