2010-12-07 2 views
0

Я тестирование (пытаюсь) функция моделирования отношений squeryl вВыбор из отношений на 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. Я не могу думать ни о чем, что могло бы вызвать такую ​​проблему. Кто-нибудь сталкивался с подобной ситуацией?

Поскольку Даниил отметил, что это может быть компиляцией проблему, я прилагая 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" 

ответ

3

Проблема заключается в предложении, где: где (b.bfoo.size GT 0)

b.bfoo.size вызывает неявное преобразование bfoo запроса к Iterable (б .bfoo - это OneToMany [Foo], который также является запросом [Foo], вызывающим .size на нем вызывает оценку запроса).

Вам нужно переписать «findBars», как это:

 
def findBars = 

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

0

Вероятно, вы используете библиотеку Squeryl скомпилированный с другой версией Scala, чем тот, который вы используете, чтобы скомпилировать свой собственный код.

Вообще говоря, весь ваш код и библиотеки должны быть скомпилированы той же версией Scala. Единственным исключением из этого, насколько я знаю, является Scala 2.8.0 /2.8.1.

+0

Я добавил несколько больше информации о процессе строительства и убедился, что я использую новейшую версию squeryl и строить проект против Скале 2.8.1 – 2010-12-08 11:52:43

 Смежные вопросы

  • Нет связанных вопросов^_^