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 _) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |