使用namedQuery获取多对多关系中的随机记录

时间:2010-06-29 06:12:39

标签: grails groovy

我在两个具有连接表的对象之间存在多对多关系。我需要能够根据父母和日期选择5个随机孩子,不包括一些儿童记录。我被卡住了。有什么想法吗?

   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 个答案:

答案 0 :(得分:2)

这些字面上的父/子关系(如人类)?如果是这样,那么子集可能非常小,我可能只是在内存中而不是通过SQL查询。

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

答案 1 :(得分:0)

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

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

说某些时候(取决于创建的Criteria查询),添加"是必要的。 1 = 1"在sqlRestriction中导致它添加"和"生成的查询中的条件。 因此,如果您使用sqle例外:

sqlRestriction " 1=1 order by rand()"