Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 按id选择行_Scala_Slick - Fatal编程技术网

Scala 按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

按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
}
是否有一种更简单的方法可以使用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
  }