2011-11-16 19 views
11

ben veritabanından sonuçlardan biri sayfa getirmek kullanıyorum Person nesneleri döndüren bir sorgu var:ScalaQuery kullanarak disk belleği sorgusu nasıl yapılır?

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) 
} 

Bu çalışır, ancak ben, ben veritabanında disk belleği yapabileceğini bilmek istiyorum yerine çıkan listede slice kullanmanın javax.persistence.Query API setFirstResult ve setMaxResults yöntemleri ile aynı şekilde.

cevap

13

tests, drop ve take gibi normal Scala toplama yöntemlerini kullanmanızı önerir. Bunlar, JDBC ResultSet'i verimli bir şekilde ele alacaktır. Ayrıca looks like uygun LIMIT ve OFFSET sorguya eklenir.

Scala koleksiyonlarındaki işlem hatları, yalnızca gerçek verileri filtreleyecek gibi görünebilir, ancak burada görebileceğiniz gibi, bilgiler, hesaplamayı daha verimli hale getirmek için boru hattını da yedekleyebilir.

Gösteri: Eğer bu işi yapmak için belirli sürücü implicits birini almak gerekir

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 

Not. Sürücü adlarının bir listesi için getting started guide'un sonuna bakın.

+1

İthalatlarınızı gösterir misiniz? 'Take (Int)' i kullanmamı gerektiren bir problemim var ama derleyici üye olmadığını söylüyor ... – Ivan

İlgili konular