11

我有一个查询,它返回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.QueryAPIsetFirstResultsetMaxResults方法一样,而不是slice在结果列表中使用。

4

1 回答 1

13

测试建议使用普通的Scala 收集方法,如droptake。这些将有效地处理 JDBC ResultSet。它看起来也很合适LIMIT,并被OFFSET添加到查询中。

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

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

于 2011-11-16T11:50:48.843 回答