11

Personデータベースから 1 ページの結果を取得するために使用しているオブジェクトを返すクエリがあります。

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.QueryAPIsetFirstResultとメソッドと同じ方法で、データベースでページングを実行できるかどうかを知りたいです。setMaxResultsslice

4

1 に答える 1

13

テストでdropは、 や などの通常の Scala コレクション メソッドの使用が提案されてい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

これを機能させるには、特定のドライバーの暗黙のうちの 1 つをインポートする必要があることに注意してください。ドライバー名のリストについては、入門ガイドの最後を参照してください。

于 2011-11-16T11:50:48.843 に答える