2010-06-29 67 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

感谢特德为您的答复。不幸的是,它不是文字和父对象可以有成千上万的孩子,所以它会花费相当昂贵的做它在内存中...任何方式来使用标准查询做到这一点? – Micor 2010-06-30 04:58:34

+0

在这种情况下,您必须在数据库中执行此操作。不幸的是,没有一个数据库不可知的获取随机行的方式。有关如何编写HQL条件以获取具有限制的随机行的详细信息,请参阅此stackoverflow后期:http://stackoverflow.com/questions/2810693/hibernate-criteria-api-get-n-random-rows – 2010-07-01 00:35:52

+0

巧妙的技巧sqlRestriction。它必须这样做。谢谢。 – Micor 2010-07-02 01:07:05

0

,如果你想使用withCriteria方法最好的解决方法是这样的:

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

说,有时(取决于创造条件查询)有必要增加一个“1这一点很重要= 1“在sqlRestriction中导致它在生成的查询中添加”和“条件。 所以,如果你有一个方形例外使用:

sqlRestriction " 1=1 order by rand()"