2011-11-16 6 views
11

Ho una domanda che restituisce Person oggetti che sto usando per recuperare una pagina di risultati dal database:Come eseguire una query a pagina utilizzando 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) 
} 

questo funziona, ma voglio sapere se posso fare il paging nel database, allo stesso modo con i metodi e setMaxResults dell'API javax.persistence.Query, invece di utilizzare slice nell'elenco risultante.

risposta

13

Il tests suggerisce di utilizzare i normali metodi di raccolta Scala come drop e take. Quelli gestiranno in modo efficiente il ResultSet JDBC. Anche looks like l'appropriato LIMIT e OFFSET vengono aggiunti alla query.

Le pipeline di operazioni su collezioni Scala possono sembrare come se stessero semplicemente filtrando i dati reali, ma come potete vedere qui le informazioni possono anche risalire la pipeline per rendere più efficiente il calcolo nel suo insieme.

Dimostrazione:

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 

Si noti che è necessario importare una delle specifiche impliciti del driver per fare questo lavoro. Vedere la fine dello getting started guide per un elenco di nomi di driver.

+1

Potresti mostrare le tue importazioni? Ho un problema che richiede di usare 'take (Int)' ma il compilatore dice che non è un membro ... – Ivan