从squeryl的关系中选择

时间:2010-12-07 17:48:28

标签: scala foreign-key-relationship squeryl

我正在测试(尝试)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.properties 和来自 project.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"

2 个答案:

答案 0 :(得分:3)

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

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

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

def findBars =

  from(bars)(b =>
    where(b.id in
              from(foo)(f=> where(f.foBar === b.id) select(f.foBar))
    )
    select(b)
  )

答案 1 :(得分:0)

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

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