【问题标题】:How to do a paged query using ScalaQuery?如何使用 ScalaQuery 进行分页查询?
【发布时间】:2011-11-16 11:27:54
【问题描述】:

我有一个查询返回 Person 对象,我使用这些对象从数据库中获取一页结果:

def page(pageNumber:Int, pageSize:Int) : Seq[Person] = database.withSession {
  val query = for(person <- People) yield person.mapped
  val startIndex = (pageNumber - 1) * pageSize
  query.list.slice(startIndex, startIndex + pageSize)
}

这可行,但我想知道我是否可以在数据库中进行分页,就像使用 javax.persistence.Query API 的 setFirstResultsetMaxResults 方法一样,而不是在结果上使用 slice列表。

【问题讨论】:

    标签: scala scalaquery


    【解决方案1】:

    tests 建议使用普通的 Scala 收集方法,例如 droptake。这些将有效地处理 JDBC ResultSet。它还将looks like 相应的LIMITOFFSET 添加到查询中。

    Scala 集合上的操作流水线可能看起来只是过滤实际数据,但正如您在此处看到的,信息也可以沿流水线返回,从而使整个计算更加高效。

    演示:

    scala> import org.scalaquery.ql.extended.PostgresDriver.Implicit._
    import org.scalaquery.ql.extended.PostgresDriver.Implicit._
    
    scala> val q1 = Entities.map { e => e }.drop(10).take(10)
    q1: org.scalaquery.ql.Query[models.Entities.type] = Query
    
    scala> q1.selectStatement
    res5: String = SELECT "t1"."guid","t1"."foo","t1"."bar" FROM "entities" "t1" LIMIT 10 OFFSET 10
    

    请注意,您需要导入特定的驱动程序隐式之一才能使其工作。请参阅getting started guide 末尾的驱动程序名称列表。

    【讨论】:

    • 能否请您展示您的进口商品?我有一个问题需要我使用take(Int),但编译器说它不是成员...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2011-07-24
    • 2011-07-28
    相关资源
    最近更新 更多