2011-11-16 5 views
11

데이터베이스에서 한 페이지의 결과를 가져 오는 데 사용하는 Person 개체를 반환하는 쿼리가 있습니다.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) 
} 

이 작업은 가능하지만 데이터베이스의 페이징을 수행 할 수 있는지 알고 싶습니다. 결과 목록에서 slice을 사용하는 대신 javax.persistence.Query API의 setFirstResultsetMaxResults 메소드와 동일한 방식으로 처리됩니다.

답변

13

testsdroptake과 같은 일반적인 스칼라 수집 방법을 사용하는 것이 좋습니다. 이들은 JDBC ResultSet을 효율적으로 처리합니다. 또한 looks likeLIMITOFFSET이 쿼리에 추가됩니다.

스칼라 컬렉션의 파이프 라인은 실제 데이터를 필터링하는 것처럼 보일 수 있지만 여기에서 볼 수 있듯이 정보는 파이프 라인을 다시 이동하여 전체적인 계산을보다 효율적으로 수행 할 수 있습니다.

데모 :이 작품을 만들기 위해 특정 드라이버 implicits 중 하나를 가져와야

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 

참고. 드라이버 이름 목록은 getting started guide 끝을 참조하십시오.

+1

수입을 제시해주세요. 나는'take (Int) '를 사용해야하는 문제가 있지만 컴파일러는 멤버가 아니라고 말합니다 ... – Ivan

관련 문제