2011-11-16 93 views
11

我有一个返回Person对象,我使用从数据库中获取结果页面查询:如何使用ScalaQuery做分页查询?

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

回答

13

tests建议使用正常的斯卡拉收集方法,如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 

请注意,您需要导入特定的驱动程序implicits之一,使这项工作。请参阅getting started guide的末尾以获取驱动程序名称列表。

+1

您能否请您出示您的进口产品?我有一个问题要求我使用'take(Int)',但编译器说它不是一个成员... – Ivan