簡體   English   中英

可變列數量Anorm結果集解析器

[英]variable columns amount Anorm result set parser

我正在嘗試使用scala,這是我的堆棧:

  • Windows 10
  • JDK 1.8
  • 斯卡拉2.11.8
  • PlayFramework 2.5
  • 安諾姆2.4.0
  • MySQL 5.5

我想使用Anorm創建一個結果集解析器,該解析器將能夠解析從給定表中選擇的任意數量的列。 這是我的代碼:

case class Campaign(id: Int, campaign_mode_id: Int, name: String)

class Application @Inject()(db: Database) extends Controller {

  val campaign = {
    get[Int]("campaign.id") ~
    get[Int]("campaign.campaign_mode_id") ~
    get[String]("campaign.name") map {
      case id ~ campaign_mode_id ~ name  => Campaign(id, campaign_mode_id, name)
    }
  }

  def index = Action {
    val data : List[Campaign] = db.withConnection { implicit connection =>
      SQL("SELECT id, campaign_mode_id, name FROM campaign").as(campaign.*)
    }

    Ok(views.html.index(data))
  }
} 

我希望能夠運行以下Sqls並仍使用相同case class Campaign

SELECT id, name FROM campaign
SELECT name FROM campaign

如何實現此功能?

更新:

我將某些字段的代碼更改類型更新為Option:

case class Campaign(id: Int, campaign_mode_id: Option[Int], name: Option[String])

class Application @Inject()(db: Database) extends Controller {

  val campaign = {
    get[Int]("campaign.id") ~
    get[Option[Int]]("campaign.campaign_mode_id") ~
    get[Option[String]]("campaign.name") map {
      case id ~ campaign_mode_id ~ name  => Campaign(id, campaign_mode_id, name)
    }
  }

  def index = Action {
    val data : List[Campaign] = db.withConnection { implicit connection =>
      SQL("SELECT id, name FROM campaign").as(campaign.*)
    }

    Ok(views.html.index(data))
  }
}

此代碼產生以下錯誤:

[RuntimeException: campaign.campaign_mode_id not found, available columns : campaign.id, id, campaign.name, name]

如果campaign_mode_id列可為空,則解析為Option[Int]並始終存在於結果集中,請使用:

get[Option[Int]]("campaign.campaign_mode_id")

如果列campaign_mode_id不可為空,則可能不會出現在結果集中,並且解析為Option[Int] ,請使用:

get[Int]("campaign.campaign_mode_id").?

就您而言,您似乎想要:

val campaign = {
  get[Int]("campaign.id") ~
  get[Int]("campaign.campaign_mode_id").? ~
  get[String]("campaign.name").? map {
     case id ~ campaign_mode_id ~ name  => Campaign(id, campaign_mode_id, name)
  }
}

假定campaign.campaign_mode_idcompaign.name都是不可為空的,但在結果集中是可選的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM