Squerylの関係から選択
-
09-10-2019 - |
質問
私はスクリールの関係モデリング機能をテストしています
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はオレトマニー[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 Libraryを使用しています。
一般的に言えば、すべてのコードとライブラリを同じSCALAバージョンでコンパイルする必要があります。それの唯一の例外は、私が知る限り、Scala 2.8.0 /2.8.1です。
所属していません StackOverflow