2013-05-13 4 views
0

동적 파인더를 사용하여 도메인 클래스 목록을로드하는 경우 (예 :Grails eager dynamic finder

List<Book> books = Book.findAllByPublicationYear(2013) 

나의 이해는 책의 목록이 느리게, 같은 그때 그들을

books.each { println "$it.title" } 

을 반복하면 내가 실행됩니다 N + 1 개 쿼리를로드 할 것입니다. 동적 파인더가 HQL 또는 조건을 사용하여 쿼리를 다시 작성하지 않고 열심히 책 목록을로드하게하는 방법이 있습니까?

+0

마녀 Grails 버전? 내가 SQL 출력을 활성화하고 나를 위해 단 하나의 쿼리를 생성했습니다. –

+0

Grails 2.1.5를 사용하고 있습니다. –

+1

DataSource.groovy에서 데이터 소스 블록에'logSql = true'를 추가하고 최대 절전 모드 블록에'format_sql = true'를 추가합니다. –

답변

4

동적 찾기는 도메인의 (관련없는) 구성원을 항상 열정적으로 가져옵니다. 예를 들어, publicationYearBook의 일부인 경우 plublicationYear과 일치하는 모든 책을 얻기 위해 항상 하나의 쿼리를 실행합니다. 내 쿼리가이 매핑을 사용하여 연결 eagerly 또는 lazilyfetch할지 여부를 경우

select this_.id as id0_0_, this_.version as version0_0_, 
this_.name as name0_0_,this_.publication_year as publicat4_0_0_ 
from book this_ 
where this_.publication_year=? 

처럼 당신이 (Author)는 프로그래밍 도메인 클래스에 말할 수있는 말 Book에 연결이 보인다 : (기본값은 게으른)

static mapping = { 
     author lazy: false //or authors if you have multiple authors for a Book 
    } 

또는

static fetchMode = [author: 'eager']