来自play anorm, create a model from json without passing anorm PK value in the json我正在尝试将Seq [地址]添加到案例类中,如
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 *)
}
}
答案 0 :(得分:4)
关于我发现有用的东西的旁注:如果你不确定你总是想要为用户获取地址,你可以避免将该关系添加为字段,而是使用元组或其他数据结构来表示。这将允许您有这样的方法:
def allUsersWithAddresses(): Map[User, Seq[Address])] = ...
但仍然有方法只返回没有连接数据的用户。
要读取连接(或子选择),您必须使用解析器解析组合输出,如下所示:
.as(User ~ Address *).groupBy(_._1)
如果你真的想把地址放在用户手中,你必须从用户解析器中将地址列表清空,然后将每个不同的用户映射到一个地址:
.as(User ~ Address *).groupBy(_._1).map {
case (user, addresses) => user.copy(addresses = addresses)
}
注意,这些示例只是指向近似解决方案的指针,而不是复制粘贴和编译就绪代码。
希望它有所帮助!
答案 1 :(得分:0)
这将起作用
/** Parses a `Blog` paired with an optional `Post` that can be later be collapsed into one object. */
val parser: RowParser[(Blog, Option[Post])] = {
simple ~ Post.parser.? map {
case blog~post => (blog, post)
}
}
def list: List[Blog] = {
DB.withConnection { implicit c =>
SQL("""
SELECT * FROM blogs b
LEFT OUTER JOIN posts p ON(p.blog_id = b.id)
""").as(parser *)
.groupBy(_._1)
.mapValues(_.map(_._2).flatten)
.toList
.map{ case (blog, posts) => blog.copy(posts = posts) }
}
}
从https://index.scala-lang.org/mhzajac/anorm-relational/anorm-relational/0.3.0?target=_2.12复制