【问题标题】:Unpack a NamedColumn in a condition of a for-loop in ScalaQuery在 ScalaQuery 中的 for 循环条件下解压缩 NamedColumn
【发布时间】:2012-08-25 19:01:28
【问题描述】:

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

参见第二个链接,第 20 行:

带有类型映射器的包: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,因此构造函数和函数调用将不起作用。我该如何完成这项工作?

我没有测试我的对象,我只是抓了一个类并剥离并重命名了东西,只是为了展示我有什么和想做的。

谢谢。

【问题讨论】:

    标签: scala scalaquery


    【解决方案1】:

    我认为你可以被 ScalaQueries 漂亮的语法所欺骗。您不能在基于 ScalaQuery 表的理解中添加任意条件。

    条件不会被 JVM 执行,而是被翻译成 SQL。这显然不适用于任意 Scala 代码,仅适用于 ScalaQuery 提供的特殊操作。

    以下版本应该可以工作:

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

    请注意,我不知道Interval.contains 的语义,因此您可能需要在其中添加一些&gt;=&lt;=

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2018-04-11
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多