检查域类'hasmany集合是否包含子集集

时间:2013-04-26 09:42:01

标签: hibernate grails gorm criteria grails-2.0

如果域对象的hasmany关联包含给定列表中的所有元素,那么我正在尝试获取域对象列表。

class Patient {
   static hasMany = [symptoms:Symptom]
}
class Symptom {
}

寻找与containsAll()类似但可以在标准中使用的东西会非常棒。但我自己找不到。我希望标准可以让我这样做:

Patient.createCriteria().list {
    'containsAll'('symptoms',listOfSymptoms)
}

2 个答案:

答案 0 :(得分:0)

这可以在HQL(更简洁)中完成,是的,Criteria中没有containsAll功能。

    Patient.executeQuery(
"FROM Patient p WHERE p IN 
(SELECT s.patient from Symptom s WHERE s.id = :id1) 
AND p IN 
(SELECT s.patient from Symptom s WHERE s.id = :id2) 
AND p IN 
(SELECT s.patient from Symptom s WHERE s.id = :id3)", 
[id1: 1, id2: 2, id3: 3])

答案 1 :(得分:0)

找到了没有条件或hql的方法。但我不知道当Patient表有数百万行数据时会发生什么。它可能会变得丑陋。

Patient.list().findAll{
    it.symptoms.containsAll(listOfSymptoms)
}

或id可以像这样使用:

Patient.list().findAll{
    it.symptoms*.id.containsAll(listOfSymptomIds)
}