Как сделать постраничный запрос, используя ScalaQuery? - PullRequest
11 голосов
/ 16 ноября 2011

У меня есть запрос, который возвращает 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 и setMaxResults API *1005* вместо использования slice в результирующем списке.

1 Ответ

13 голосов
/ 16 ноября 2011

Тесты предлагают использовать обычные методы сбора 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

Обратите внимание, что вам нужно импортировать одно из особых воздействий на драйвер, чтобы это работало. См. В конце руководство по началу работы список имен драйверов.

...