2013-04-07 64 views
0

嘗試在Slick中執行多對多關係時,我一直在收到錯誤。這test顯示如何在Slick中執行多對多關係。我跟着它,但然後去這個錯誤:在Slick中聲明表格

Select(TableNode, "id") found. This is typically caused by an attempt to use a "raw" table object directly in a query without introducing it through a generator 

然後我發現,這是通過在一個靜態的位置(對象),聲明你的表,然後嘗試導入它引起的(它工作正常,如果對象是在同一塊中)。 http://slick.typesafe.com/doc/1.0.0/lifted-embedding.html#tables

好吧,所以val T = new Table裏面的一個object就是答案。但現在我得到這個錯誤:

recursive method bs needs result type 

,如果它是一個object而不是val它並不需要一個結果類型。我聽說過使用class,但我找不到如何執行此操作的任何示例。

如何聲明多對多模型並從其他地方導入它們?

編輯: 這裏展示我的意思是一個要點:https://gist.github.com/pjrt/5332311

如果您運行的第一個測試,它會通過,沒有問題。

如果你運行的第二次測試,下面的錯誤被拋出:

scala.slick.SlickException: Select(TableNode, "id") found. This is typically caused by an attempt to use a "raw" table object directly in a query without introducing it through a generator. 

如果您運行的第三個測試(使用對象,而不是直接對象的內部丘壑),你得到這個錯誤:

recursive method bs needs result type 
[error] val A = new Table[(Int, String)]("a") { 

recursive value AToB needs type 
[error]  def as = AToB.filter(_.bId === id).flatMap(_.aFK) 

我知道錯誤發生的原因,但我想知道人們是如何繞過它們的。一種方法是將對象放入類中,並在每次使用Slick時實例化一個類(但這看起來很奇怪)。另一種方法是從不使用與包之外的Slick相關的東西(或者至少是多對多的東西),但這看起來也很糟糕。

我的問題仍然是,你們如何解決這個問題?有沒有合適的方法?

+1

你不能分享你的表的代碼嗎? – pedrofurla 2013-04-07 17:01:01

+0

新增了一個要點來展示我的意思。 – Nacht 2013-04-07 20:54:07

+0

如果您創建了一個Slick測試用例並提交了一個github拉取請求,我們可以走得更近。請將它放在https://github.com/slick/slick/tree/master/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests或https://github.com/slick/ slick/tree/master/slick-testkit/src/test/scala/scala/slick/test/lifted – cvogt 2013-04-10 16:30:49

回答

0

您顯示的錯誤消息使我認爲您定義了您的表格,但試圖直接訪問它們而不是使用for理解。

test file you were referring有一個例子就在底部,界定是這樣

val q1 = for { 
    a <- A if a.id >= 2 
    b <- a.bs 
} yield (a.s, b.s) 
q1.foreach(x => println(" "+x)) 
assertEquals(Set(("b","y"), ("b","z")), q1.list.toSet) 

你看到的是該對象表A用作理解產生許多對多表後(即a <- A

您的代碼是否以其他方式訪問表?

+0

我在OP上添加了一個要點來顯示我的意思。 – Nacht 2013-04-07 20:39:43