2010-12-07 32 views
0

Je teste (essayer) les relations de squeryl la fonction de modélisationSélection des relations sur 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)) 
    } 
} 

Si je tente de tester ce code avec le code suivant:

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

Et je reçois l'erreur suivante :

java.util.NoSuchElementException: None.get 

l'exception est levée du corps de findBars. Je ne peux pas penser à tout ce qui pourrait causer un tel problème. Est-ce que quelqu'un a rencontré une situation similaire?

Depuis Daniel a fait remarquer qu'il pourrait être un problème de compilation, je Concaténer les build.properties et une propriété de 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" 

Répondre

3

Le problème réside dans la clause where: où (b.bfoo.size gt 0)

b.bfoo.size provoque une conversion implicite de la bfoo requête à un Iterable (b .bfoo est un OneToMany [Foo] qui est aussi une requête [Foo], appelant .size sur lui provoquer l'évaluation de la requête).

Vous devez réécrire « findBars » comme ceci:

 
def findBars = 

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

0

Vous utilisez probablement une bibliothèque Squeryl compilé avec une version différente de Scala que celui que vous utilisez pour compiler votre propre code.

D'une manière générale, tout votre code et vos bibliothèques doivent être compilés par la même version de Scala. La seule exception à cela, pour autant que je sache, est Scala 2.8.0 /2.8.1.

+0

J'ai ajouté un peu plus d'informations sur le processus de construction et fait en sorte que j'utilisais la nouvelle version de squeryl et la construction du projet contre scala 2.8.1 –