如何用Anorm两次更好地解析同一个表?

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只会解析第一联接的列(两次),这样tofrom将是相同的.

这可以使用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)

然后UserMessage解析器中为每个使用不同的别名:

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一个StateCountry等等?这将需要别名多个表和解析器,这会变得非常混乱.

有没有更好的方法来实现这一目标?也就是说,我希望在一个查询中选择所有相关数据,并使用解析器组合器解析它,而不需要大量的列别名方案.