2014-08-27 44 views
1

假設我有一些小列的表,和一個大的(比如BLOB)列:斯利克 - 可選包括/省略大柱

case class Thing(id: Int, small1: String, small2: String, small3: String, large: String) 

    class ThingMapping(tag: Tag) extends Table[Thing](tag, "things") { 

    def id = column[Int]("id", O.PrimaryKey, O.NotNull, O.AutoInc) 
    def small1 = column[String]("small1") 
    def small2 = column[String]("small2") 
    def small3 = column[String]("small3") 
    def large = column[String]("large") 

    def * = (id, small1, small2, small3, large) <> (Thing.tupled, Thing.unapply) 

    } 

在某些情況下,我想查詢除large列以外的所有列的表格。在其他人中,我想包括它。我更喜歡使用大小寫類而不是元組。

Slick是否有這樣的模式?

選項,我認爲:

  1. 有兩個映射 - 一個 「瘦」 和 「胖」 的映射。
  2. 將大柱拆分成單獨的表格,然後根據需要加入。
+0

爲什麼不定義'large'爲'選項[字符串]'了' Thing' case類和可選的表定義,然後添加另一個選擇'def'如'def allNoLarge =(id,small1,small2,small3)'你在哪裏不要從db中選擇'large'字段。然後,將它留給調用代碼來選擇使用哪個「def」選項。 – cmbaxter 2014-08-27 13:12:17

+0

@cmbaxter - 目前,我的調用代碼使用的東西是:'val things = TableQuery [ThingMapping]'。如何適應在映射中有多個選擇定義? – 2014-09-01 09:44:56

+0

您仍然可以使用'TableQuery'作爲起點,然後使用'.map'方法產生一個僅查詢特定列的新查詢。我會添加一個答案顯示這一點。 – cmbaxter 2014-09-01 12:37:04

回答

-1

我認爲您需要的是您的TableQuery上的map函數,以便您僅選擇一部分字段。因此,像這樣:

case class Thing(id: Int, small1: String, small2: String, small3: String, large: String) 
case class LiteThing(id: Int, small1: String, small2: String, small3: String) 
class ThingMapping(tag: Tag) extends Table[Thing](tag, "things") { 
    def id = column[Int]("id", O.PrimaryKey, O.NotNull, O.AutoInc) 
    def small1 = column[String]("small1") 
    def small2 = column[String]("small2") 
    def small3 = column[String]("small3") 
    def large = column[String]("large") 
    def * = (id, small1, small2, small3, large) <> (Thing.tupled, Thing.unapply) 
} 
val things = TableQuery[ThingMapping] 

val liteThingQuery = things.map(t => LiteThing(t.id, t.small1, t.small2, t.small3)) 

所以我添加了名爲LiteThing另一個案例類,它表示字段的子集,不包括large列。然後我使用map創建一個新的查詢,該查詢不會選擇large字段,並且它會映射到LiteThing。我沒有編譯過這個,但我很確定這是你想要進入的方向。我從Hello Slick Activator Template的「選擇特定列」一節(在完全擴展教程信息之後)得到了這個。

你可以玩的替代像

def small = (id, small1, small2, small3) 
def * = (small, large) 

def small = (id, small1, small2, small3) 
def * = small ~ large <> (Thing.tupled, Thing.unapply) 

而且在使用

things.map(_.small)