【问题标题】:In Anorm is it possible to apply multiple ColumnAliaser to the same query在 Anorm 中是否可以将多个 ColumnAliaser 应用于同一个查询
【发布时间】:2016-12-02 00:55:42
【问题描述】:

该场景与How to better parse the same table twice with Anorm? 的问题类似,但无法再使用针对该问题描述的解决方案。

在消息有 2 个用户的情况下,我需要使用 SQL 连接解析 from_user 和 to_user。

case class User(id: Long, name: String)

case class Message(id: Long, body: String, to: User, from: User)

def userParser(alias: String): RowParser[User] = {
    get[Long](alias + "_id") ~ get[String](alias + "_name") map {
        case id~name => User(id, name)
    }
}

val parser: RowParser[Message] = {
    userParser("from_user") ~
    userParser("to_user") ~
    get[Long]("messages.id") ~ 
    get[String]("messages.name") map {
        case from~to~id~body => Message(id, body, to, from)
    }
}

// More alias here possible ?
val aliaser: ColumnAliaser = ColumnAliaser.withPattern((0 to 2).toSet, "from_user.")

SQL"""
SELECT from_user.* , to_user.*, message.* FROM MESSAGE
JOIN USER from_user on from_user.id = message_from_user_id
JOIN USER to_user on to_user.id = message.to_user
"""
.asTry(parser, aliaser)

【问题讨论】:

  • 请准确回答问题:我想问题不在于是否可以重用 ColumnAliaser 实例(因为它显然可以不可变),而是可以将多个 ColumnAliaser 应用于同一个查询

标签: scala anorm


【解决方案1】:

如果我认为您想对同一个查询应用多个具有不同别名策略的 ColumnAliaser 是正确的,请务必了解 ColumnAliaser“只是”一个 specific implementation of Function[(Int, ColumnName), Option[String]],因此它可以被定义/组合与任何Function 一样,并通过其companion object 中的工厂函数进行了简化。

import anorm.{ ColumnAliaser, ColumnName }

val aliaser = new ColumnAliaser {
  def as1 = ColumnAliaser.withPattern((0 to 2).toSet, "from_user.")
  def as2 = ColumnAliaser.withPattern((2 to 4).toSet, "to_user.")

  def apply(column: (Int, ColumnName)): Option[String] =
    as1(column).orElse(as2(column))
}

【讨论】:

    猜你喜欢
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2019-04-26
    • 2019-08-17
    相关资源
    最近更新 更多