2

呼び出し元のクライアントに json として渡すことができるクラス (DTO クラス) のインスタンスを作成する最善の方法を見つけるのが難しいと感じています。

私は次のクラス構造を持っています。

object Suppliers extends Table[(Int, String, String, String, String, String)]("SUPPLIERS") {
  def id = column[Int]("SUP_ID", O.PrimaryKey) // This is the primary key column
  def name = column[String]("SUP_NAME")
  def street = column[String]("STREET")
  def city = column[String]("CITY")
  def state = column[String]("STATE")
  def zip = column[String]("ZIP")
  def * = id ~ name ~ street ~ city ~ state ~ zip
}

object Coffees extends Table[(Int,String, Double,Int, Int)]("COFFEES") {
  def id = column[Int]("Id",O.PrimaryKey)
  def name = column[String]("COF_NAME")
  def price = column[Double]("PRICE")
  def sales = column[Int]("SALES")
  def total = column[Int]("TOTAL")
  def * = id ~ name ~ price ~ sales ~ total
}

object CoffeeSuppliers extends Table[(Int,Int,Int)]("CoffeeSuppliers") {
    def id = column[Int]("Id",O.PrimaryKey)
    def supID = column[Int]("Sup_ID")
    def coffeeID = column[Int]("Coffee_ID")
    def supplier = foreignKey("SUP_FK", supID, Suppliers)(_.id) 
    def coffees = foreignKey("COF_FK", coffeeID,Coffees)(_.id)
    def * = id ~ supID ~ coffeeID
}

この単純な結合クエリを使用して、ID 101 のサプライヤーと彼が提供するすべてのコーヒーを取得しています。

            val q3 = for {
          ((cs,c),s) <- CoffeeSuppliers innerJoin 
                        Coffees on (_.coffeeID === _.id) innerJoin 
                        Suppliers on (_._1.supID === _.id) if cs.supID === 101 
        } yield (cs,c,s)

クエリは正常に機能しており、データを取得できます。しかし、クエリ結果から DTO クラスを構築したいと考えています。クラスの構造は休閑地のようです

  case class CoffeeDTO(
                       id:Option[Int] = Some(0),
                       name:String[String] = "",
                       price:Double= 0.0
                      )
  case class SupplierDTO (
                      id:Option[Int] = Some(0),
                      name:String = "",
                      coffees:List[CoffeeDTO] = Nil
  )

SupplierDTO のインスタンスを作成し、クエリ結果から値を割り当てる方法は?

4

1 に答える 1

2

このようなものはどうですか:

q3.map{ case (cs,c,s) => ((s.id.?,s.name),(c.id.?,c.name,c.price)) } // remove not needed columns and make ids Options
  .list // run query
  .groupBy( _._1 ) // group by supplier
  .map{ case (s,scPairs) => SupplierDTO( s._1, // map each group to a supplier with associated coffees
                                     s._2,
                                     scPairs.map(_._2) // map group of pairs to only coffee tuples
                                            .map(CoffeeDTP.tupled) // create coffee objects
  )}
  .head // take just the one supplier out of the list
于 2013-09-18T12:20:06.390 に答える