2015-07-10 3 views
0

Предположим, что у нас есть база данных, которая содержит две таблицы: Coffee и Suppliers, и у нас есть соответствующие классы и таблицы классов, как в документации :создать класс Таблица для существующей таблицы slick scala (Slick 3.0.0, scala)

import scala.slick.driver.MySQLDriver.simple._ 
import scala.slick.lifted.{ProvenShape, ForeignKeyQuery} 


// A Suppliers table with 6 columns: id, name, street, city, state, zip 
class Suppliers(tag: Tag) extends Table[(Int, String, String, String, String, String)](tag, "SUPPLIERS") { 
    def id: Column[Int] = column[Int]("SUP_ID", O.PrimaryKey) // This is the primary key column 
    def name: Column[String] = column[String]("SUP_NAME") 
    def street: Column[String] = column[String]("STREET") 
    def city: Column[String] = column[String]("CITY") 
    def state: Column[String] = column[String]("STATE") 
    def zip: Column[String] = column[String]("ZIP") 

    // Every table needs a * projection with the same type as the table's type parameter 
    def * : ProvenShape[(Int, String, String, String, String, String)] = (id, name, street, city, state, zip) 
} 

// A Coffees table with 5 columns: name, supplier id, price, sales, total 
class Coffees(tag: Tag) extends Table[(String, Int, Double, Int, Int)](tag, "COFFEES") { 
    def name: Column[String] = column[String]("COF_NAME", O.PrimaryKey) 
    def supID: Column[Int] = column[Int]("SUP_ID") 
    def price: Column[Double] = column[Double]("PRICE") 
    def sales: Column[Int] = column[Int]("SALES") 
    def total: Column[Int] = column[Int]("TOTAL") 

    def * : ProvenShape[(String, Int, Double, Int, Int)] = (name, supID, price, sales, total) 

    // A reified foreign key relation that can be navigated to create a join 
    def supplier: ForeignKeyQuery[Suppliers, (Int, String, String, String, String, String)] = 
    foreignKey("SUP_FK", supID, TableQuery[Suppliers])(_.id) 
} 

Теперь предположим, что мы хотим сделать присоединиться:

val result = for { 
     c <- coffees 
     s <- suppliers if c.supID === s.id 
} yield (c.name, s.name) 

и здесь дело с результатом осложнена (и это более сложным, если у нас есть много объединений), потому что мы должны всегда запомнить порядок имен, узнать, чтоили _._2 см ... и т.д.

Вопрос 1 Есть ли способ, чтобы изменить тип результата в виде таблицы нового класса, который содержит нужные столбцы?

Вопрос 2 Вот способ, но я не могу закончить его, мы строим класс случай, например:

case class Joined(nameS: String,nameC: String) 

и после этого построим соответствующую таблицу, в которой я не знаю, как

class Joineds extends Table[Joinedclass] { 
//Todo 
} 

и когда мы пишем объединение мы можем написать что-то вроде (так что мы можем преобразовать результат к типу Регистрация):

val result = for { 
     c <- coffees 
     s <- suppliers if c.supID === s.id 
} yield (c.name, s.name).as(Joinds) 

Спасибо.

ответ

1

Вы можете определить его как:

val result = for { 
    c <- coffees 
    s <- suppliers if c.supID === s.id 
} yield Joined(c.name, s.name) 

И в складке его прочь в некотором удобном месте?

+0

Спасибо за ваш ответ, я решил проблему по-другому, но на самом деле ваш пример интересен, тип 'result' is' Seq [Join] '? – Elaqqad

+0

После запуска запроса вы сможете получить Seq [Регистрация] и ждать завершения проекта, да. Приятно слышать, как вы это решили! – Rikard