mysql - 玩Scala Anorm一对多关系

标签 mysql scala playframework playframework-2.0 anorm

来自play anorm, create a model from json without passing anorm PK value in the json我正在尝试将 Seq[Address] 添加到案例类中,例如

case class User(
  id: Pk[Long] = NotAssigned,
  name: String = "",
  email: String = "",
  addresses: Seq[Address])

Address 是一个包含三个字符串的简单对象/类。一个用户可以有多个地址,我如何在 findAll 中获取所有地址以及用户。

  def findAll(): Seq[User] = {
    Logger.info("select * from pt_users")
    DB.withConnection { implicit connection =>
      SQL(
        """
          select * from pt_users where name like {query} limit {size} offset {offset}   
        """).as(User.list *)
    }
  }

最佳答案

关于我发现有用的东西的旁注:如果你不确定你是否总是想要获取用户的地址,你可以避免将该关系添加为字段,而是使用元组或其他数据结构来表示他们。这将允许您使用这样的方法:

def allUsersWithAddresses(): Map[User, Seq[Address])] = ...

但仍然有只返回用户而没有连接数据的方法。

要读取连接(或子选择),您必须使用解析器解析组合输出,如下所示:

.as(User ~ Address *).groupBy(_._1)

如果你真的想把地址放在用户中,你必须从用户解析器中将地址列表清空,然后将每个不同的用户映射到一个地址:

.as(User ~ Address *).groupBy(_._1).map { 
  case (user, addresses) => user.copy(addresses = addresses)
}

请注意,这些示例只是指向近似解决方案的指针,而不是复制-粘贴-编译就绪代码。

希望对您有所帮助!

关于mysql - 玩Scala Anorm一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17878128/

相关文章:

scala - 模块化Scala设计: how do I avoid a constructor "push-out" boilerplate?

scala - 拆分 Play ! 2 应用成模块

java - 在play框架scala中获取数据

module - 如何在不引用绝对路径的情况下引用 Play Framework 第三方模块?

mysql - 带数据库 ID 的 Htaccess 重定向 url

php - laravel 5.2 仅从 mysql 返回 int

php - 基于日期的年份报表查询

mysql - 如何用 WHERE 编写 SQL prepare 语句

algorithm - 无向图中自由选择起始节点的最长路径的最小值

java - 在 Play Framework 中使用单个函数插入/更新数据库