我正在测试(尝试)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"
答案 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。