Как выполнить поисковый запрос с помощью ScalaQuery?

У меня есть запрос, который возвращает Person объекты, которые Im использует для извлечения одной страницы результатов из базы данных:

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 setFirstResult и setMaxResults, вместо использования slice в результате список.

Ответ 1

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

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