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