我在Slick尝试做多对多关系时遇到了错误。这个test显示了如何在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.
如果你运行第三次测试(使用对象内部的val而不是直接使用对象),则会出现此错误:
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相关的东西(或者至少是多对多的东西),但这看起来也很糟糕。
我的问题仍然是,你们是如何解决这个问题的?有没有正确的方法?
答案 0 :(得分:0)
您显示的错误消息让我认为您已定义了表格,但却尝试直接访问它们而不是使用for comprehension。
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
)
您的代码是否以其他方式访问表格?