2017-01-03 51 views
0

我試圖從2周前創建的表中獲取所有記錄。試圖從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

其實你已經差不多了。它用於讀取和寫入。但這裏是:它需要在範圍(即使爲您的過濾)。

平原油滑的解決方案

只要把你轉換爲同伴對象是這樣的:

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部分問題中沒有明確說明(儘管問題標籤爲playframework標籤)。如果你正在使用play-slick比你的做法是這樣的:需要用混合-在一起或擴展HasDatabaseConfigProvider

把你的談話到traittrait DbImplicits)。

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 
} 

編輯:BTW我只是注意到在這個片段另一個錯誤:

f.status != 0 

您應該使用油滑操作:

f.status =!= 0 
+0

是那個dateColumnType轉換類型安全,或ca它會拋出異常? –

+0

一個不一定排除另一個。您可以創建一個轉換,導致引發異常。 編譯時驗證範圍內是否存在轉換 - 無論是實際實現將導致運行時異常 - 這是另一回事。 –

+0

@coolbreeze - 對不起,你問過這個「特殊」轉換。是的 - 它不應該在運行時拋出異常。它基本上歸結爲在某些情況下'Timestamp.from(i)'或'ts.toInstant'是否可以拋出異常。 這個映射(和Slick一般)的整點是類型安全的 –