在ScalaQuery中以for循环的方式解包NamedColumn

时间:2012-08-25 19:01:28

标签: scala scalaquery

我对Scala和ScalaQuery很陌生,现在使用它几周了。我试图通过调用函数找出查询中的条件,但我得到一个NamedColumn [T]而不是T,如何解压缩它?

见第二行,第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,因此构造函数和functioncall将不起作用。我如何使这项工作?

我没有测试我的对象,我只是抓住了一个类并剥离并重命名了一些东西,但只是为了展示我拥有和想要做的事情。

感谢。

1 个答案:

答案 0 :(得分:1)

我认为你可以通过ScalaQueries很好的语法来欺骗。你不能在基于ScalaQuery表的理解中放入任意条件。

JVM不会执行这些条件,而是将其转换为SQL。这显然不适用于任意Scala代码,而只适用于ScalaQuery提供的特殊操作。

以下版本应该有效:

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

请注意,我不知道Interval.contains的语义,因此您可能需要在其中抛出一些>=<=