2010-06-29 2 views
0

두 테이블간에 조인 테이블을 사용하여 다 대 다 관계가 있습니다. 나는 몇몇 아이들 기록을 제외하고 부모와 날짜에 기초를 둔 5 명의 무작위 아이들을 선정 할 수있을 것입니다 필요가 있습니다. 나는 붙어있다. 어떤 아이디어?namedQuery와 다 대다 관계의 임의의 레코드를 가져 오는 중

Parent { 
     static hasMany = [children: Child] 
    } 

    Child { 
     Date dob 
     static belongsTo = [Parent] 
     static hasMany = [parents: Parent] 

     static namedQueries { 

     randomFiveChildrenBornAfter { parentid, dob, excludeChildren-> 

      qt 'dob', dob    
      parents { 
      eq 'id',parentid 
      } 
      // not in(excludeChildren) ?? order by rand() ?? 
     } 
     } 
    } 

답변

2

인간과 마찬가지로 문자 그대로 부모/자녀 관계입니까? 그렇다면 어린이 세트는 매우 작을 것이고 SQL 쿼리를 통해서보다는 메모리에서 할 것입니다.

parent.children 
    .findAll { dob >= fiveYearsAgo } 
    .sort { Math.random() } 
    .with { it.size() >= 5 ? it.subList(0,5) : it } 
+0

감사합니다. 불행히도 리터럴이 아닌 부모 객체는 수천 개의 자식을 가질 수 있으므로 메모리 사용량이 비쌉니다. criterias를 사용하는 쿼리로 수행하는 방법은 무엇입니까? – Micor

+0

그런 경우 데이터베이스에서해야 할 것입니다. 불행히도, 임의의 행을 가져 오는 데이터베이스에 독립적 인 방법은 없습니다. 제한이있는 임의의 행을 가져 오는 HQL 기준을 작성하는 방법에 대한 자세한 내용은이 stackoverflow 게시물을 참조하십시오. http://stackoverflow.com/questions/2810693/hibernate-criteria-api-get-n-random-rows –

+0

깔끔한 트릭 sqlRestriction. 그것은해야 할 것입니다. 감사. – Micor

0

당신이 withCriteria 방법을 사용하려는 경우 가장 좋은 해결 방법은 이것이다 :

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

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

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