2011-11-16 15 views
11

Tengo una consulta que devuelve Person objetos que estoy usando a buscar una página de resultados de la base de datos:¿Cómo hacer una consulta paginada usando 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) 
} 

Esto funciona, pero quiero saber si puedo hacer la paginación en la base de datos, de la misma manera que con los métodos javax.persistence.Query API setFirstResult y setMaxResults, en lugar de usar slice en la lista resultante.

Respuesta

13

La tests sugiere utilizar métodos normales de recolección de Scala como drop y take. Esos manejarán eficientemente el ResultSet de JDBC. También se agregaron looks likeLIMIT y OFFSET apropiados a la consulta.

Las tuberías de operaciones en las colecciones de Scala pueden parecer como si estuvieran simplemente filtrando datos reales, pero como puede ver aquí, la información también puede viajar por la tubería para hacer el cómputo como un todo más eficiente.

Demostración:

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 

Tenga en cuenta que es necesario importar uno de los implícitos de controladores específicos para hacer este trabajo. Consulte el final de getting started guide para obtener una lista de nombres de controladores.

+1

¿Podría mostrar sus importaciones? Tengo un problema que me obliga a usar 'take (Int)' pero el compilador dice que no es miembro ... – Ivan

Cuestiones relacionadas