Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/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.slick.lifted.Query转换为案例类_Scala_Slick - Fatal编程技术网

将scala.slick.lifted.Query转换为案例类

将scala.slick.lifted.Query转换为案例类,scala,slick,Scala,Slick,我有一个光滑的表“UserSchema”,如下所示: class UserSchema(tag: Tag) extends Table[User](tag, "users") { def name = column[String]("name", O.NotNull) def password = column[String]("password", O.NotNull) def graduatingYear = column[Int]("graduating_year", O.N

我有一个光滑的表“UserSchema”,如下所示:

class UserSchema(tag: Tag) extends Table[User](tag, "users") {

  def name = column[String]("name", O.NotNull)
  def password = column[String]("password", O.NotNull)
  def graduatingYear = column[Int]("graduating_year", O.NotNull)
  def id = column[Int]("id", O.NotNull, O.PrimaryKey, O.AutoInc)

  def * = (name, password, graduatingYear, id.?) <> (User.tupled, User.unapply)

}
case class User(name: String, password: String, graduatingYear: Int, id: Option[Int] = None)
我在
users
对象中有一个
TableQuery[UserSchema]
,在
db
对象中有一个数据库

如何将以下内容转换为用户对象

db withSession { implicit session =>
  users.filter(_.id === 1)
}
目前,我有

db withSession { implicit session =>
    val list = users.filter(_.id === id).list
    list(0)
}
这很管用,但我觉得很难看。有更好的方法吗


感谢您的帮助。

您可以在Slick查询中使用地图,如下所示:

db withSession { implicit session =>
  val userlist = users.filter(_.id === id).list
    .map(user => User(user._1, user._2, user._3, Some(user._4)))
}
其中,
userlist
User
的集合,
list()
方法返回一个
list[User]
,但如果您只对第一个条目感兴趣,请使用
firstOption

db withSession { implicit session =>
  val users = TableQuery[UserSchema]
  val someUser: Option[User] = users.filter(_.id === id).firstOption
}

它返回
Some(User)
如果查询发现了某个内容,则返回其他
None
,这也更安全,因为可能会发生查询没有结果并调用
列表(0)
可能会导致异常。

您不需要映射,因为一旦您提供了,到案例类的转换将由slick自动执行。谢谢!我不知道这是可能的。找到了这个链接(),这也有助于解释它。不客气,但请注意,本教程是针对Slick 1.X的,这个语法
id.?~名称
在第2版中没有使用,我链接的答案也很旧,但它非常精确,是最好的解释之一。