Распаковать NamedColumn в условии цикла for в ScalaQuery

Я новичок в Scala и ScalaQuery, использую его уже пару недель. Я пытаюсь выяснить условие в запросе, вызывая функцию, но получаю NamedColumn[T] вместо T, как его распаковать?

См. 2-ю ссылку, строка 20:

пакет с typemapper: https://gist.github.com/3469291

объект таблицы: https://gist.github.com/3469291

case class MyObject (
        id: Long,
        created: JodaTime
        modified: JodaTime
        special: JodaTime
)

object MyObjects extends Table[MyObject]("my_objects") {

  lazy val database = Database.forDataSource(DB.getDataSource())

  def id = column[Long]("id", O PrimaryKey, O AutoInc, O NotNull)
  def created = column[JodaTime]("created", O NotNull)
  def modified = column[JodaTime]("modified", O NotNull)
  def special = column[JodaTime]("special", O NotNull)
  def * = id ~ created <> (MyObject, MyObject.unapply _)

  def getMarker(time: JodaTime) = database.withSession { implicit db:Session =>
    (for {
      e <- MyObjects if (new org.joda.time.Interval(e.created, e.modified).contains(e.special)
    } yield (e.id, e.created)).firstOption
  }
}

e.created/modified/special являются NamedColumns, поэтому конструктор и вызов функции не будут работать. Как мне заставить это работать?

Я не тестировал свой объект, я просто взял класс и разделил и переименовал вещи, но просто чтобы показать, что у меня есть и что я хочу сделать.

Спасибо.


person Jasper    schedule 25.08.2012    source источник


Ответы (1)


Я думаю, вы могли бы обмануть хороший синтаксис ScalaQueries. Вы не можете просто поставить произвольные условия для понимания на основе таблиц ScalaQuery.

Условия не выполняются JVM, а переводятся в SQL. Это, очевидно, не работает для произвольного кода Scala, а только для специальных операций, предоставляемых ScalaQuery.

Следующая версия должна работать:

for {
  e <- MyObjects 
  if (e.created < e.special)
  if (e.modified > e.special)
}

Обратите внимание, что я понятия не имею о семантике Interval.contains, поэтому вам, возможно, придется добавить туда несколько >= или <=.

person Jens Schauder    schedule 25.08.2012