Frage

Ich teste (Versuch) squeryl Beziehungen Modellierung Merkmal

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))
    }
}

Wenn ich versuche, diesen Code mit dem folgenden Code zu testen:

test("Test findBars"){
  using(jdbcSession){
      val mybars = telemetria.findBars
      for{i <- mybars}{
          println(i.id)
          i.id should equal(1)
      }
  } 
}

Und ich folgende Fehlermeldung erhalten:

java.util.NoSuchElementException: None.get

Die Ausnahme wird aus dem Körper von geworfen findBars . Ich kann nicht darüber nachdenken, etwas, das ein solches Problem verursacht sein könnte. Hat jemand laufen in einer ähnlichen Situation?

Da Daniel wies darauf hin, dass es sich um eine Zusammenstellung Problem sein könnte, ich Anfügen des build.properties und eine Eigenschaft von 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"
War es hilfreich?

Lösung

Das Problem liegt in der where-Klausel: where (b.bfoo.size gt 0)

b.bfoo.size bewirkt, dass eine implizite Konvertierung der bfoo Abfrage in eine Iterable (B.bfoo ist ein OneToMany [Foo], die auch eine Query [Foo], rufen .Size auf sich die Auswertung der Abfrage verursachen).

Sie müssen "findBars" wie folgt umschreiben:

def findBars =

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

Andere Tipps

Sie sind eine Squeryl Bibliothek wahrscheinlich unter Verwendung von mit einer anderen Version von Scala zusammengestellt als die verwenden Sie Ihren eigenen Code zu kompilieren.

Im Allgemeinen der gesamten Code und Bibliotheken müssen vom gleichen Scala Version kompiliert werden. Die einzige Ausnahme, dass, soweit ich weiß, ist Scala 2.8.0 /2.8.1.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top