2011-11-16 30 views
11

Tôi có một truy vấn mà trả Person đối tượng mà tôi đang sử dụng để lấy một trang kết quả từ cơ sở dữ liệu:Làm thế nào để thực hiện truy vấn được phân trang bằng 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) 
} 

này hoạt động, nhưng tôi muốn biết nếu tôi có thể làm phân trang trong cơ sở dữ liệu, tương tự như với các phương pháp setFirstResultsetMaxResults của javax.persistence.Query API, thay vì sử dụng slice trên danh sách kết quả.

Trả lời

13

tests đề xuất sử dụng các phương pháp thu thập thông thường của Scala như droptake. Những người đó sẽ xử lý hiệu quả JDBC ResultSet. Nó cũng looks like thích hợp LIMITOFFSET được thêm vào truy vấn.

Đường ống hoạt động trên bộ sưu tập Scala có thể trông giống như chúng chỉ lọc dữ liệu thực tế, nhưng như bạn có thể thấy ở đây thông tin cũng có thể quay trở lại đường ống để tính toán hiệu quả hơn.

diễ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 

Lưu ý rằng bạn cần phải nhập khẩu một trong những implicits lái xe cụ thể để làm công việc này. Xem phần cuối của getting started guide để biết danh sách tên trình điều khiển.

+1

Bạn có thể vui lòng hiển thị hàng nhập của mình không? Tôi đã có một vấn đề đòi hỏi tôi phải sử dụng 'take (Int)' nhưng trình biên dịch nói rằng nó không phải là một thành viên ... – Ivan

Các vấn đề liên quan