我正在测试(尝试)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. 。我想不出可能引起此类问题的任何事情。有人遇到类似情况吗?

由于丹尼尔指出这可能是一个编译问题,所以我正在附加 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"
有帮助吗?

解决方案

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

b.bfoo.size 导致bfoo查询的隐式转换为峰值(b.bfoo是一个onetomany [foo],也是一个查询[foo],调用。尺寸 在其上导致查询的评估)。

您需要重写这样的“ Findbars”:

def findBars =

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

其他提示

您可能正在使用与Scala版本不同的Squeryl库,与您使用的代码相比,Scala版本不同。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top