Ищете помощь во вложенной groupBy с помощью scalikejdbc?

#scala #scalikejdbc

#scala #scalikejdbc

Вопрос:

Я использую Scala 2.12, и необходимые библиотеки загружены через build.sbt.

У меня есть выходные данные моей базы данных в приведенном ниже формате. введите описание изображения здесь

В принципе, это похоже на дату оценки и книгу, могут быть данные в нескольких валютах.

У меня есть group by в книге (в основном), в которой будет список данных Pnl на основе валюты.

Просто приблизительное представление:

 { Bookid: 1234,
  BookName: EQUITY,
  PnlBreakdown: [currency: cad, actual_pnl_local: 100, actual_pnl_cde: 100], [currency: usd, actual_pnl_local: 100, actual_pnl_cde: 130]
}
  

В принципе. Ключом будет book, а значением — список данных pnl.

У меня есть класс case, определенный следующим образом:

 case class PnlData(valuation_date: Option[String], currency: Option[String],pnl_status: Option[String],actual_pnl_local: Option[String] ,actual_pnl_cde: Option[String], actual_pnl_local_me_adj: Option[String] ,actual_pnl_cde_me_adj: Option[String] ) {
  override def toString():String= {
    s"valuation_date=$valuation_date,currency=$currency,pnl_status=$pnl_status,actual_pnl_local=$actual_pnl_local,actual_pnl_cde=$actual_pnl_cde,actual_pnl_local_me_adj=$actual_pnl_local_me_adj,actual_pnl_cde_me_adj=$actual_pnl_cde_me_adj"
  }
}

case class BookLevelDaily(book_id: Option[String], book: Option[String], pnlBreakdown: List[SaPnlData]){
  override def toString():String= {
    s"book_id=$book_id,book=$book,pnl=$pnlBreakdown"
  }
}
  

В принципе, мой конечный объект имеет тип BookLevelDaily.

Как мне перевести выходные данные базы данных (выше) в мой объект BookLevelDaily?

Я могу преобразовать весь результат в список, но как мне дальше сделать groupBy?

 val list: List[BookLevelDaily] =
      sql"""
           |SELECT QUERY TO GET ABOVE RESULTSET
        """.stripMargin.map(rs =>
        BookLevelDaily(
          valuation_date = rs.stringOpt("valuation_date"),
          book_id = rs.stringOpt("book_id"),
          book =  rs.stringOpt("book"),
          currency=  rs.stringOpt("currency"),
          pnl_status=  rs.stringOpt("pnl_status"),
          actual_pnl_local=  rs.stringOpt("actual_pnl_local"),
          actual_pnl_cde=  rs.stringOpt("actual_pnl_cde"),
          actual_pnl_local_me_adj= rs.stringOpt("actual_pnl_local_me_adj"),
          actual_pnl_cde_me_adj= rs.stringOpt("actual_pnl_cde_me_adj")
        )
      ).list().apply()
  

Во-первых, приведенное выше не относится к типу BookLevelDaily. Итак, как выполнить итерацию или группировку по, чтобы отделить данные уровня Pnl и сопоставить их с ключом (book).

Ответ №1:

Если я правильно понимаю, это, похоже, отношение «один ко многим» (один: book_level_daily, многие: pnl_breakdown). Если да, проверьте следующую документацию.

http://scalikejdbc.org/documentation/one-to-x.html