Mic*_*jac 9 scala playframework anorm
假设我有以下两个类:
case class User(id: Long, name: String)
case class Message(id: Long, body: String, to: User, from: User)
Run Code Online (Sandbox Code Playgroud)
在RowParserS可能会发生是这个样子:
val parser: RowParser[User] = {
get[Long]("users.id") ~ get[String]("users.name") map {
case id~name => User(id, name)
}
}
val parser: RowParser[Message] = {
get[Long]("messages.id") ~
get[String]("messages.name") ~
User.parser ~
User.parser map {
case id~body~to~from => Message(id, body, to, from)
}
}
Run Code Online (Sandbox Code Playgroud)
除了这是行不通的,因为加入时users表两次,ANORM只会解析第一联接的列(两次),这样to和from将是相同的.
这可以使用User解析器中的列别名来克服:
def parser(alias: String): RowParser[User] = {
getAliased[Long](alias + "_id") ~ getAliased[String](alias + "_name") map {
case id~name => User(id, name)
}
}
Run Code Online (Sandbox Code Playgroud)
然后User在Message解析器中为每个使用不同的别名:
val parser: RowParser[Message] = {
get[Long]("messages.id") ~
get[String]("messages.name") ~
User.parser("to") ~
User.parser("from") map {
case id~body~to~from => Message(id, body, to, from)
}
}
Run Code Online (Sandbox Code Playgroud)
这对于简单的场景是可以的,但是如果User更复杂并且有Address一个State和Country等等?这将需要别名多个表和解析器,这会变得非常混乱.
有没有更好的方法来实现这一目标?也就是说,我希望在一个查询中选择所有相关数据,并使用解析器组合器解析它,而不需要大量的列别名方案.