2013-04-26 369 views
1

你好,我試圖獲得域對象的列表,如果域對象的hasmany關聯包含給定列表中的所有元素。檢查域類'hasmany集合是否包含子集集合

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

尋找類似containsAll()的東西,但可以在標準的使用將是真棒。但我自己找不到。我希望標準將讓我這樣做:

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

如果運行與列表語句而不是listDistinct查詢,它的工作原理?只是爲了檢查問題出在哪裏。 – lucke84 2013-04-26 11:56:23

+0

是的最後一段代碼的工作原理和它應該做的。問題是我無法找到相當於list.containsAll(subset) – 2013-04-26 13:31:14

回答

0

這可以在HQL來完成(更簡潔),並肯定存在標準不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]) 
+0

的條件表達式謝謝。但我如何構建這個查詢,如果我只是一個集合('List'或'Set')'ID' – 2013-04-28 15:54:12

0

已找到一種方法來做到沒有標準或hql。但是我不知道當Patient表擁有數百萬行數據時會發生什麼。它可能會變得醜陋。

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

或ID可以像這樣使用:

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

我無法說服自己建議你在這裏做同樣的事情。在這種情況下複雜性增加。 '.list()'遍歷整個表並返回所有行,'findAll'遍歷所有行,'sympt * .id'遍歷所有'症狀',最後'containsAll'破壞其餘行。 :)。我本可以提出相同的建議,但我希望您的應用程序在沒有飢餓的情況下生存。 :)嘗試將幾千條記錄添加到「Patient」和「Symptom」,並查看其差異。 – dmahapatro 2013-04-28 16:07:37

+0

是的,它的工作速度很慢:D。你能告訴我如何用給定的'id'列表構造查詢字符串嗎? – 2013-04-30 11:33:08

相關問題