0

我正在测试(尝试)squeryl 的关系建模功能

class Foo(val id: Long, val foBar: Long) extends KeyedEntity[Long]{
    //Many Foo's can have one Bar.
    lazy val fbar: ManyToOne[Bar] = myschema.barToFoo.right(this)
}
class Bar(val id: Long) extends KeyedEntity[Long]{
    //One Bar can be assigned to many Foo's.
    lazy val bfoo: OneToMany[Foo] = myschema.barToFoo.left(this)
}

object myschema extends Schema{
    val bars= table[Bar]
    val foo= table[Foo]
    val barToFoo =
        oneToManyRelation(Bar, Foo).
        via((b,f) => b.id === f.foBar)
    /** Find all Bars that are assigned to at least one foo.*/
    def findBars() ={
        from(bars)((b) => where(b.bfoo.size gt 0) select(b))
    }
}

如果我尝试使用以下代码测试该代码:

test("Test findBars"){
  using(jdbcSession){
      val mybars = telemetria.findBars
      for{i <- mybars}{
          println(i.id)
          i.id should equal(1)
      }
  } 
}

我收到以下错误:

java.util.NoSuchElementException: None.get

异常是从findBars的主体中抛出的。我想不出任何可能导致此类问题的事情。有没有人遇到过类似的情况?

由于 Daniel 指出这可能是一个编译问题,因此我将附加build.propertiesproject.scala中的一个属性

project.organization=org.simepar
project.name=scalatra-sbt-prototype
sbt.version=0.7.4
project.version=2.0.0.M2
def.scala.version=2.8.1
build.scala.versions=2.8.1
project.initialize=false

;

val squeryl = "org.squeryl" % "squeryl_2.8.0" % "0.9.4-RC3"
4

2 回答 2

3

问题在于 where 子句: where(b.bfoo.size gt 0)

b.bfoo.size导致 bfoo Query 到 Iterable 的隐式转换(b.bfoo 是一个 OneToMany[Foo],它也是一个 Query[Foo],在其上调用 .size会导致对查询的评估)。

您需要像这样重写“findBars”:

def findBars =

  从(条)(b =>
    在哪里(b.id 在
              从(foo)(f=> where(f.foBar === b.id) 选择(f.foBar))
    )
    选择(b)
  )

于 2010-12-09T00:53:48.783 回答
0

您可能正在使用使用不同版本的 Scala 编译的 Squeryl 库,而不是您用于编译自己的代码的库。

一般来说,你所有的代码和库都需要用同一个 Scala 版本编译。据我所知,唯一的例外是 Scala 2.8.0 /2.8.1。

于 2010-12-07T21:52:34.983 回答