2013-01-15 35 views
7

के साथ सेट वाले आइटम ढूंढना मैं उन टैग्स को ढूंढना चाहता हूं जिनमें सभी उनके टैग सेट में दिए गए टैग शामिल हैं।किसी दिए गए सेट के सभी तत्वों को jpql

@Entity 
class Item { 
    @ManyToMany 
    var tags: java.util.Set[Tag] = new java.util.HashSet[Tag]() 
} 

@Entity 
class Tag { 
    @ManyToMany(mappedBy="tags") 
    var items: java.util.Set[Item] = new java.util.HashSet[Item] 
} 

यदि मैं यह

select distinct i 
from Item i join i.tags t 
where t in (:tags) 

है जैसे कि यह कोशिश मैं आइटम कि दिया टैग के किसी भी शामिल मिलती है:

यहाँ सरलीकृत वर्ग हैं। यह आश्चर्य की बात नहीं है, लेकिन मुझे उन आइटम्स चाहिए जिनमें दिए गए टैग के सभी शामिल हैं।

select distinct i 
from Item i join i.tags t 
where (:tags) in t 

मैं त्रुटि संदेश org.hibernate.exception.SQLGrammarException: arguments of row IN must all be row expressions मिल: तो मैं इसे दूसरी तरह के आसपास की कोशिश करो। यह काम करता है अगर tags में केवल एक टैग है, लेकिन यह उससे अधिक के साथ विफल रहता है।

मैं इसे जेपीक्यूएल में कैसे व्यक्त कर सकता हूं?

select i from Item i join i.tags t 
where t in :tags group by i.id having count(i.id) = :tagCount 
+0

क्योंकि मुझे लगता है कि आप हाइबरनेट में अन्य सरणी के साथ सेट की तुलना नहीं कर सकते हैं। मुझे लगता है कि आपको एसक्यूएल क्वेरी कोड दोबारा लिखना होगा। –

+0

क्वेरी क्वेरी = session.createQuery ("स्टॉक से जहां स्टॉक आईडी (: कोड)"); query.set पैरामीटर सूची ("कोड", idList); –

+0

मैं सराहना करता हूं कि आपने अपने प्रश्न में दिखाया है कि आप उन वस्तुओं को कैसे प्राप्त करते हैं जिनमें दिए गए टैग में से कोई भी शामिल है! यही वह है जिसे मैं ढूंढ रहा था। मैं पुष्टि कर सकता हूं कि यह '@ ElementCollection की भी काम करता है। –

उत्तर

8

चाल गिनती का प्रयोग है। मैंने reductio विज्ञापन absurdum का उपयोग किया:

select distinct i from Item i where i not in (select i2 from Item i2 join i2.tags t where t not in :tags) 
+0

यह उन चीजों में से एक है जो आपको हमेशा देखने के लिए लेते हैं, और फिर जब आप करते हैं, तो आप विश्वास नहीं कर सकते कि आपने इसे –

2

मैं बस आप के रूप में ही समस्या थी:

+0

के साथ नहीं देखा है। मुझे यह विधि पसंद है क्योंकि मेरे पास पहले से ही एक प्रश्न है जो मैंने किया नहीं चाहते हैं, लेकिन उप क्वेरी परिणामों के छोटे होने के लिए मुझे आंतरिक चयन में कई स्थितियों को जोड़ने की आवश्यकता होगी। इसके बजाय मैंने यहां वर्णित एक गिनती विधि का उपयोग किया है http://stackoverflow.com/a/21645545/429896 जिसे "समूह द्वारा" के बाद सामान जोड़ने की आवश्यकता नहीं है। – HypeXR