加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Slick 3.0:从Option(Scala Play Framework)内的数据库获取GET结

发布时间:2020-12-16 08:58:35 所属栏目:安全 来源:网络整理
导读:我有一个API的代码,允许我从数据库中检索和对象,并使用Slick 3.0返回一个 JSON对象: // Modelcase class Thing(id: Option[Int],name: String)object Thing { implicit val teamWrites = Json.writes[Thing]}class Things(tag: Tag) extends Table[Thing](t
我有一个API的代码,允许我从数据库中检索和对象,并使用Slick 3.0返回一个 JSON对象:

// Model

case class Thing(id: Option[Int],name: String)

object Thing {
  implicit val teamWrites = Json.writes[Thing]
}

class Things(tag: Tag) extends Table[Thing](tag,"thing") {
  def id = column[Int]("id",O.PrimaryKey,O.AutoInc)
  def name = column[String]("name")
  def * = (id.?,name) <> ((Thing.apply _).tupled,Thing.unapply)
}

object Things {
  private val db = Database.forConfig("h2mem1")
  private object things extends TableQuery[Things](tag ? new Things(tag)) { 
    def all = things.result 
  }
  private def filterQuery(id: Int): Query[Things,Thing,Seq] = 
    things.filter(_.id === id)

  def findById(id: Int): Future[Thing] = db.run(filterQuery(id).result.head)
}
// Controller

class ThingController extends Controller {
  def get(id: Int) = Action.async {
    Things.findById(id).map(thing => Ok(Json.obj("result" -> thing)))
  }
}

问题是如果我查询不在数据库中的对象,我会得到一个例外.我想要做的是在Model中返回一个从Model返回的Option,以便能够编写如下内容:

// Controller

class ThingController extends Controller {
  def get(id: Int) = Action.async {
    Things.findById(id).map {
      case None => NotFound(Json.obj("error" -> "Not Found"))) 
      case Some(thing) => Ok(Json.obj("result" -> thing)))
    }
  }
}

是否有意义?

解决方法

只需在结果上调用headOption而不是head:

def findById(id:Int):Future [Option [Thing]] = db.run(filterQuery(id).result.headOption)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读