问题 如何使用ScalaQuery进行分页查询?


我有一个返回的查询 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 蜜蜂 setFirstResult 和 setMaxResults 方法,而不是使用 slice 在结果列表上。


3647
2017-11-16 11:27


起源



答案:


测试 建议使用正常的Scala集合方法 drop 和 take。这些将有效地处理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

请注意,您需要导入一个特定的驱动程序含义才能使其工作。看到结束了 入门指南 获取驱动程序名称列表。


13
2017-11-16 11:50



你能告诉你的进口吗?我有一个问题要求我使用 take(Int) 但是编译器说它不是会员...... - Ivan


答案:


测试 建议使用正常的Scala集合方法 drop 和 take。这些将有效地处理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

请注意,您需要导入一个特定的驱动程序含义才能使其工作。看到结束了 入门指南 获取驱动程序名称列表。


13
2017-11-16 11:50



你能告诉你的进口吗?我有一个问题要求我使用 take(Int) 但是编译器说它不是会员...... - Ivan