0

尝试在 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如果它是 a而不是 a则不需要结果类型val。我听说过使用 aclass但我找不到任何有关如何执行此操作的示例。

你如何声明多对多模型并从其他地方导入它们?

编辑:这是一个要点,说明我的意思: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.

如果您运行第三个测试(使用对象内部的 vals 而不是直接使用对象),您会收到以下错误:

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 相关的东西(或者至少是多对多的东西),但这似乎也很糟糕。

我的问题仍然是,你们如何解决这个问题?有正确的方法吗?

4

1 回答 1

0

您显示的错误消息让我认为您定义了表格,但尝试直接访问它们而不是使用 for comprehension。

您所指的测试文件在定义多对多表之后在底部有一个示例,如下所示

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

您的代码是否以其他方式访问表?

于 2013-04-07T17:28:02.343 回答