2011-11-16 81 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