Scala 按id选择行
按id选择一行应该是一件简单的事情,但是我在弄清楚如何将它映射到我的对象时遇到了一些麻烦 我发现它在寻找同样的东西,但给出的答案对我不适用 目前,我有这是工作,但它似乎没有优雅,因为它应该是Scala 按id选择行,scala,slick,Scala,Slick,按id选择一行应该是一件简单的事情,但是我在弄清楚如何将它映射到我的对象时遇到了一些麻烦 我发现它在寻找同样的东西,但给出的答案对我不适用 目前,我有这是工作,但它似乎没有优雅,因为它应该是 def getSingle(id: Long):Option[Category] = withSession{implicit session => (for{cat <- Category if cat.id === id} yield cat ).list.headOption //re
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
}
是否有一种更简单的方法可以使用Slick从ID获取选项[T]
解决方案:存在驱动程序问题。我不能使用.firstOption,但升级到mysql jdbc 5.1.25,一切都很好 首先,您可以尝试使用相同代码的脱胶版本:
Category.filter{ _.id === id }.list.headOption
看起来干净多了
您也可以使用firstOption方法:
Category.filter{ _.id === id }.firstOption
您可以这样做:
def getSingle(id: Long):Option[Category] = withSession{implicit session =>
Query(Category).where(_.id === id).firstOption
}
如果你经常使用这个查询,那么你应该考虑QueDeaseM模板:
val byId=t.createFinderBy t=>t.id 这将创建一个预编译的prepared语句,您可以从方法中使用它def getSingleid:Long:Option[Category]=byIdid.firstOption我将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
}
或者甚至。首先,如果您确定您的查询正在返回一个对象。这不是QueryCategory吗?@alno实际上我已经切换到了过滤器版本,只是没有在这里更新我的代码。但是使用Category.filter.id==id.firstOption会导致类型不匹配;找到:Option[scala.slick.lified.NothingContainerTableNothing]必需:Option[models.Category]这就是我首先切换到list.headOption的原因。刚刚测试-我在两个变体中都得到了Option[scala.slick.lified.NothingContainerTableNothing],在QueryCategory中包装表有帮助。@alno当我使用QueryCategory时,我在“OPTION sql\u SELECT\u LIMIT=DEFAULT”附近的sql语法中出现sql错误。如果我使用您发布的第一个解决方案,在“OPTION sql\u SELECT\u LIMIT=DEFAULT”附近的sql语法中出现错误,可能是驱动程序问题。看看更新到mysql%mysql连接器java%5.1.25。很好,谢谢@Nilanjan稍微好一点,val byId=t.createFinderBy_u2;id
def findById(id: Int)(implicit session: Session): Option[Category] = {
Category.byId(id).firstOption
}