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.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"
4

2 に答える 2

3

問題は where 句にあります: where(b.bfoo.size gt 0)

b.bfoo.sizeは、bfoo Query を Iterable に暗黙的に変換します (b.bfoo は、Query[Foo] でもある OneToMany[Foo] であり、 .sizeを呼び出すと、クエリが評価されます)。

次のように「findBars」を書き直す必要があります。

デフォルトfindBars =

  from(バー)(b =>
    where(b.id in
              from(foo)(f=> where(f.foBar === b.id) select(f.foBar))
    )
    選択(b)
  )

于 2010-12-09T00:53:48.783 に答える
0

おそらく、独自のコードをコンパイルするために使用しているものとは異なるバージョンのScalaでコンパイルされたSquerylライブラリを使用しています。

一般的に、すべてのコードとライブラリは同じScalaバージョンでコンパイルする必要があります。私の知る限り、それに対する唯一の例外はScala2.8.0/2.8.1です。

于 2010-12-07T21:52:34.983 に答える