我在两个具有连接表的对象之间存在多对多关系。我需要能够根据父母和日期选择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() ??
}
}
}
答案 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()"