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

scala slick查询返回值

发布时间:2020-12-16 09:22:44 所属栏目:安全 来源:网络整理
导读:我在Scala中相当新,并且一直在努力学习,无法看到如何将查询的结果返回给调用方法 我有一个简单的UserDto case class UserDto(val firstName:String,val lastName:String,val userName:String,val isAdmin:Boolean) {} 一个用户表对象 object User extends Ta
我在Scala中相当新,并且一直在努力学习,无法看到如何将查询的结果返回给调用方法

我有一个简单的UserDto

case class UserDto(val firstName:String,val lastName:String,val userName:String,val isAdmin:Boolean) {}

一个用户表对象

object User extends Table[(String,String,Boolean)]("USER") {

  def firstName = column[String]("FIRST_NAME")
  def lastName = column[String]("LAST_NAME")
  def userName = column[String]("USER_NAME")
  def admin = column[Boolean]("IS_ADMIN")

  def * = firstName ~ lastName ~ userName ~ admin

}

和一个查询类

class UserQuerySlickImpl(dataSource:DataSource) {

  def getResults(userName:String):Option[UserDto] = {
    var resultDto:Option[UserDto] = None

    Database.forDataSource(dataSource) withSession {
      val q = for {u <- User if u.userName is userName}
      yield (u.firstName,u.lastName,u.userName,u.admin)

      for (t <- q) {
        t match {
          case (f:String,l:String,u:String,a:Boolean) => 
            resultDto = Some(new UserDto(f,l,u,a))
        }
      }
    }
    resultDto
  }
}

我可以查询数据库并获取与用户名匹配的用户,但是我可以知道如何返回该用户的唯一方法是通过在Database.forDataSource …. {}之外创建一个var.

有没有更好的方法不使用var但直接返回resultDto.

还有一种方法可以直接从第一个构造UserDto用于理解,而不是需要第二个(t < - q)... 我正在使用slick_2.10.0-M7,版本0.11.1.

解决方法

您的q是查询,而不是结果列表. foreach的存在在这方面可能有点混乱,但是要获得一个结果列表,你需要先做q.list.这给你的方法,如map和foldLeft等等.

如果要在选项中获取单个/第一个结果,请使用q.firstOption.一旦你这样做了,你可以将你的函数映射到结果’Option [(…)]’上,以将元组转换成所需的DTO.

另一种方法是指定一个自定义映射,通过使用<>来自动将结果元组映射到某个案例类.运算符,见http://slick.typesafe.com/doc/0.11.2/lifted-embedding.html#tables:

case class User(id: Option[Int],first: String,last: String) 

object Users extends Table[User]("users") {
  def id = column[Int]("id",O.PrimaryKey,O.AutoInc)
  def first = column[String]("first")
  def last = column[String]("last")
  def * = id.? ~ first ~ last <> (User,User.unapply _)
}

(编辑:李大同)

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

    推荐文章
      热点阅读