2010-12-07 3 views
7

나는이 : Grails GORM을 사용하여 테이블에서 임의의 행을 반환 하시겠습니까? 내 Grails 애플리케이션에서

keywords = Keyword 
    .findAll("from Keyword where locale = '$locale' order by rand() ", [max:20]) 

는 위의 기준과 일치하는 테이블의 행의 수천이있다 가정하자. 하지만 그것은 테이블에서 반환 된 행이 무작위가 아니지만 반환되는 20 행의 컨텍스트 내에서 행이 Db에 순서대로 저장되어있는 것처럼 보입니다. 내 응용 프로그램의 경우이 테이블에서 행 ID 203, 행 ID 3789, 행 ID 9087, 행 ID 789 등과 같이 완전히 임의의 행을 반환하도록이 쿼리를 원한다. 어떻게 가능합니까?

+0

당신이 DataSource.groovy에에서 SQL 로깅을 설정하고 볼 수 쿼리가 생성되고 무엇을? MySQL에 대해 비슷한 쿼리를 사용하고 예상대로 작동하는 것 같습니다. – leebutts

+0

사실, 우리는 실행 쿼리를 사용하고 있습니다. 내 대답보기 ... – leebutts

답변

12

나는 다음과 같은 스타일을 사용

Keyword.executeQuery('from Keyword order by rand()', [max: 9]) 

을 그리고 전체 테이블 (우리는 MySQL을 사용하고 있습니다)에서 임의의 행을 반환합니다.

실행 쿼리가 findAll과 다르게 동작하는 이유는 확실하지 않습니다.

0

당신이 .withCriteria를 사용하려면 해당 workaraound을 수행 할 수 있습니다

User.withCriteria{ 
eq 'name', 'joseph' 
sqlRestriction " order by rand()" 
} 

그것은 추가 할 필요가 있다고 언젠가는 (생성 된 기준 쿼리에 따라 다름) 말을하는 것이 중요합니다 "1 = 1"에 sqlRestriction은 생성 된 쿼리에 "and"조건을 추가합니다. 그래서 당신은 sqle 예외 사용할 수있는 경우 :

sqlRestriction " 1=1 order by rand()" 
관련 문제