Domanda

Sono test (provare) le relazioni di modellazione squeryl funzione

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

Se provo a testare il codice con il seguente codice:

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

E ottengo il seguente errore:

java.util.NoSuchElementException: None.get

L'eccezione viene gettata dal corpo di findBars . Non riesco a pensare a qualcosa che potrebbe essere la causa tale problema. Avere qualcuno incorrere in una situazione simile?

Dato che Daniel ha sottolineato che potrebbe essere un problema la compilazione, sto aggiungendo il build.properties e una proprietà da 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"
È stato utile?

Soluzione

Il problema sta nella clausola in cui:    dove (b.bfoo.size gt 0)

b.bfoo.size provoca una conversione implicita del bfoo Query per un Iterable (B.bfoo è un OneToMany [Foo] che è anche una query [Foo], chiamando .size su di esso causare la valutazione della query).

È necessario riscrivere "findBars" in questo modo:

def findBars =

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

Altri suggerimenti

Probabilmente si sta utilizzando una libreria Squeryl compilato con una versione diversa di Scala rispetto a quello che si utilizza per compilare il proprio codice.

In generale, tutto il codice e le librerie devono essere compilato dalla stessa versione Scala. L'unica eccezione a questo, per quanto ne so, è Scala 2.8.0 /2.8.1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top