TableQuery到案例类的列表

时间:2017-06-11 19:47:01

标签: scala playframework-2.0 slick-3.0

我有一个播放应用程序,使用slick 3查询下面的Mysql DB: 我已经定义了一个User case类和Users,如下所示:

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

    class Users(tag: Tag) extends Table[User](tag, "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.tupled, User.unapply)
    }
val users = TableQuery[Users]

现在,当我使用姓氏“Smith”查询用户时。这就是它的样子

val usersTab = users.filter(usr => usr.last === 'Smith').result
val userList:List[User] = users.map(usr => User(usr.id,usr.first,usr.last)).toList 

同样,如果我将List [User]作为userList需要添加到数据库中。然后,

users.map(usr => (usr.id,usr.first,usr.last))+=((userList(0).id,userList(0).first, userList(0).last)) //Iterate over all element 

所以我期待一种更简洁,更简洁的方法将List of case class转换为TableQuery,反之亦然。有更好的方法吗?

上面的解决方案运行良好,但我有十几个需要填充的表。然后它开始变得丑陋和重复。

1 个答案:

答案 0 :(得分:1)

User类实例列表写入表可以使用++=方法完成,如下所示

def insert(data: List[User]) = {
  db.run(users ++= data)
}

根据姓氏查询,如下所示。以下方法返回Future List Userdef queryLastName(lastName: String): Future[List[User]] = { db.run(users.filter(usr => usr.last === lastName).result) }

.class public HelloWorld
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
  .limit stack 3
  .limit locals 1

  getstatic      java/lang/System/out Ljava/io/PrintStream;
  ldc            "Hello World."
  invokevirtual  java/io/PrintStream/println(Ljava/lang/String;)V

  return

.end method