试图从2周前获得所有记录

时间:2017-01-03 02:05:02

标签: scala playframework slick

我正在尝试从2周前创建的表中获取所有记录。

我的方法如下:

 def getRecent(from: Instant): Future[Seq[User]] = {
    db.run(
      users.filter(f => f.status != 0 && f.createdAt > from ).sortBy(_.id.desc).result
    )
  }

我已经隐含了我认为会起作用,但我想这只是为了阅读行:

class UsersTable(tag: Tag) extends Table[User](tag, "users") {

    implicit val dateColumnType = MappedColumnType.base[Instant, Timestamp](
      i => Timestamp.from(i),
      ts => {
        ts.toInstant

      }
    )

    def id = column[Int]("id", O.PrimaryKey)
    ....

错误是:

 value > is not a member of slick.lifted.Rep[java.time.Instant]

1 个答案:

答案 0 :(得分:1)

其实你差点就到了。它用于读取和写入。但事情就是这样:它需要在范围(即使是你的过滤)。

普通光滑解决方案

只需将您的转化转换为伴侣对象:

object UserTable {
    implicit val dateColumnType = MappedColumnType.base[Instant, Timestamp](
      i => Timestamp.from(i),
      ts => {
        ts.toInstant

      }
    )
}

然后执行此操作:

def getRecent(from: Instant): Future[Seq[User]] = {
    // I added this import here
    import UserTable.dateColumnType

    db.run(
      users.filter(f => f.status != 0 && f.createdAt > from ).sortBy(_.id.desc).result
    )
 }

Play-Slick解决方案

以上回答并不适合play-slick部分,但未在问题中明确说明(尽管问题标有playframework标记)。如果您使用的是play-slick,那么您的方法将是这样的:

将您的对话放入traittrait DbImplicits),要求与HasDatabaseConfigProvider一起混合或扩展{。}}。

trait DbImplicits { self: HasDatabaseConfigProvider[JdbcProfile] =>
  import self.driver._

    implicit val dateColumnType = MappedColumnType.base[Instant, Timestamp](
        i => Timestamp.from(i),
        ts => {
           ts.toInstant
        }
    )
}

稍后使用它:

class MyClassUsingImplicits @Inject()(
    protected val dbConfigProvider: DatabaseConfigProvider
) extends HasDatabaseConfigProvider[JdbcProfile] 
  with DbImplicits {
  import driver._

  // your further code comes here
}

编辑:顺便说一下,我刚注意到这个片段中的另一个错误:

f.status != 0

您应该使用Slick运算符:

f.status =!= 0