我正在尝试从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]
答案 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
,那么您的方法将是这样的:
将您的对话放入trait
(trait 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