数据库
首页 > 数据库> > mysql-播放Scala Anorm一对多关系

mysql-播放Scala Anorm一对多关系

作者:互联网

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

case class User(
  id: Pk[Long] = NotAssigned,
  name: String = "",
  email: String = "",
  addresses: Seq[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)
}

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

希望能有所帮助!

标签:scala,playframework,playframework-2-0,anorm,mysql
来源: https://codeday.me/bug/20191030/1969235.html