2010-01-29 7 views
6

के माध्यम से प्राप्त करें मेरे पास एक मूल इकाई और बाल संस्थाओं के बीच एक से कई मैपिंग हैं। अब मुझे माता-पिता की सूची के लिए प्रत्येक माता-पिता से जुड़े बच्चों की संख्या की आवश्यकता है। मैं इसे एचक्यूएल के साथ करने की कोशिश कर रहा हूं लेकिन मुझे यकीन नहीं है कि मैं वहां माता-पिता की सूची कैसे प्राप्त कर सकता हूं। साथ ही, मुझे नहीं पता कि मैं इकाई को कैसे वापस कर सकता हूं न केवल इसकी आईडी। मेरे वर्तमान HQL क्वेरी है:बच्चों को HQL

select new map(parent.id as parentId, count(*) as childCount) 
from Parent parent left join parent.children children 
group by parent.id 

लेकिन यह केवल आईडी वापस आती है और विशिष्ट माता-पिता पर फ़िल्टर नहीं करती।

संपादित पास्कल जवाब के आधार पर मैं

select new map(parent as parent, count(elements(parent.children)) as childCount) 
from Parent parent 
group by parent 

काम करता है यही कारण है कि करने के लिए क्वेरी को संशोधित किया है, लेकिन निषेधात्मक धीमी है: के बजाय 30 सेकंड में एक ही डेटाबेस पर 400 एमएस।

+0

दरअसल, कि बुरी तरह धीमी है:

मामले में किसी और को एक विशेष रूप से माता पिता के लिए बच्चों की संख्या को खोजने के लिए की जरूरत है, तो आप कुछ इस तरह इस्तेमाल कर सकते हैं। वास्तव में स्वीकार्य रूप से स्वीकार्य ... –

+0

इंडेक्स (गति पर जोर दे सकता है) गति के साथ मदद कर सकता है, लेकिन दूसरा विकल्प है कि यदि आप कर सकते हैं तो एचक्यूएल क्वेरी को भागों में तोड़ना है - मुझे कभी-कभी मदद मिलती है। या आप प्रत्येक मूल तत्व के लिए अलग-अलग प्रश्न कर सकते हैं, और मानचित्र को स्वयं बना सकते हैं। एक अच्छा डेटाबेस प्रोफाइलर संभवतः अन्वेषण में मदद करेगा। – aperkins

+0

मैंने जो समाधान चुना है वह सबसे पहले डेटाबेस से सभी माता-पिता को पुनर्प्राप्त करना है, फिर क्वेरी को चलाएं जो मुझे मूल आईडी और गणना देता है और फिर जावा में दो को विलय करता है। मुझे वैसे भी सभी माता-पिता मिलना है, और उस सूची को बाल गणना के साथ विलय करना एक सेकंड से भी कम समय लेता है, जो इस स्थिति में ठीक है। –

उत्तर

4

मैं 100% है कि यह सुनिश्चित करें, लेकिन इस बारे में क्या नहीं कर रहा हूँ:

select new map(parent.id, count(elements(parent.children))) 
from Parent parent group by parent.id 
+0

काम नहीं करता है, मुझे ऐसा करने पर SQL-अपवाद मिलता है क्योंकि जेनरेट किए गए SQL समूह parent.id द्वारा हैं लेकिन कई अन्य कॉलम भी चुनते हैं। –

+0

@ थॉमस आह हाँ, वास्तव में, मैंने तदनुसार अपना जवाब अपडेट कर लिया है –

0

धन्यवाद। मैं किसी विशेष माता-पिता के लिए बच्चों की संख्या की तलाश में था और आपकी पोस्ट ने मुझे सही दिशा में शीर्षक दिया।

Query query = this.sessionFactory.getCurrentSession().createQuery("select count(elements(parent.children)) from Parent parent where name = :name"); 
query.setString("name", parentName); 
System.out.println("count = " + query.uniqueResult());