2011-08-04 16 views
9

प्राप्त करें मैं एक समूह पर गिनती के लिए औसत प्राप्त करने की कोशिश कर रहा हूं, सबकुरी के साथ जुड़कर। पता नहीं है कि क्या यह बिल्कुल सही तरीका है लेकिन मैं मैसेमा दस्तावेज़ के अलावा अन्य सामानों के बारे में कुछ भी नहीं कर सका।जेपीक्यूएल/क्वेरीरीएसएल: सबक्वायरी में शामिल हों और अलियाड कॉलम

परिदृश्य: ग्राहक द्वारा प्रति उत्पाद कितने आदेश औसतन करते हैं? मतलब: एक ग्राहक आदेश उत्पादों। तो एक ग्राहक ने एक विशिष्ट उत्पाद को कई बार (गिनती) का आदेश दिया। ग्राहक द्वारा किसी भी उत्पाद के लिए रखे गए आदेशों की औसत संख्या क्या है?

थोड़ा सा कल्पित ध्वनि हो सकता है, वास्तव में यह प्रोटोटाइप का हिस्सा है, लेकिन इससे मुझे आश्चर्य हुआ कि माईसेमा से फैंसी क्वेरीडीएसएल के साथ एक सबक्वायरी में बनाए गए कस्टम कॉलम का संदर्भ कैसे प्राप्त किया जाए।

एसक्यूएल में आप केवल गिनती कॉलम को उपनाम देते हैं और दूसरे आईडी कॉलम का उपयोग करने में शामिल होते हैं। QueryDSL में "as()" विधि भी है लेकिन मेरे पास कोई विचार नहीं है, उस कॉलम को कैसे पुनर्प्राप्त करें और मैं यह नहीं देखता कि यह किसी अन्य प्रश्न के साथ एक प्रश्न में कैसे शामिल हो सकता है, क्योंकि query.list() को सिर्फ एक सूची मिलती है लेकिन कुछ के लिए कारण इसे स्वीकार करता है। गलत लगता है ...

यहाँ मेरी कोड है:

JPQLQuery query = createJPQLQuery(); 

    QOrdering qOrdering = QOrdering.ordering; 
    QProduct qProduct = QProduct.product; 
    QCustomer qCustomer = QCustomer.customer;   

    // how many of each product did a customer order? 
    HibernateSubQuery subQuery = new HibernateSubQuery(); 
    subQuery.from(qOrdering).innerJoin(qOrdering.product,qProduct).innerJoin(qOrdering.customer, qCustomer); 
    subQuery.groupBy(qCustomer,qProduct).list(qCustomer.id,qProduct.id,qProduct.count()); 

    // get the average number of orders per product for each customer 
    query.from(qCustomer);  
    query.innerJoin(subQuery.list(qCustomer.id,qOrdering.count().as("count_orders")));  
    query.groupBy(qCustomer.id); 
    return (List<Object[]>) query.list(qCustomer.firstname,subQuery.count_orders.avg()); 

फिर: मैं एक सबक्वेरी के साथ कैसे शामिल होऊं? मैं एजीजी (मेरा समूह सही बीटीडब्ल्यू है?) अधिक समेकन करने के लिए एलियाज्ड "गिनती" कॉलम कैसे प्राप्त करूं? हो सकता है कि इसमें कुछ अन्य त्रुटियां हों, इसलिए किसी भी मदद की सराहना की!

धन्यवाद!

संपादित करें: मैं QueryDSL उपज देखना चाहते हैं देशी एसक्यूएल तरह का यही कारण है कि:

Select avg(numOrders) as average, cust.lastname from 
customer cust 
inner join 
(select count(o.product_id) as numOrders, c.id as cid, p.name 
from ordering o 
inner join product p on o.product_id=p.id 
inner join customer c on o.customer_id=c.id 
group by o.customer_id, o.product_id) as numprods 
on cust.id = numprods.cid 
group by numprods.cid 
order by cust.lastname; 

उत्तर

11

खंड में शामिल होने में सबक्वेरी का प्रयोग अनुमति नहीं है। जेपीक्यूएल में, सबक्वायरीज़ को केवल WHERE और HAVING भाग में ही अनुमति दी जाती है। Querydsl जेपीए क्वेरी में जॉइन विधि हस्ताक्षर बहुत व्यापक हैं।

चूंकि इस क्वेरी को समूह के दो स्तरों की आवश्यकता है, शायद इसे जेपीक्यूएल/क्वेरीडल्स जेपीए के साथ व्यक्त नहीं किया जा सकता है।

मैं क्वेरीबेल जेपीए मूल क्वेरी समर्थन का उपयोग करके इस क्वेरी को लिखने का सुझाव दूंगा।

चूंकि क्वेरीज़ल जेपीए आंतरिक रूप से जेपीक्यूएल का उपयोग करता है, यह जेपीक्यूएल की अभिव्यक्ति से प्रतिबंधित है।

+0

धन्यवाद! हालांकि, हालांकि, मैं QueryDSL और किसी भी सैद्धांतिक सीमा के आधार पर एक सामान्य खोज बनाने के बारे में सोच रहा हूं, मुझे अपने खोज मार्कअप में वैकल्पिक तकनीकों को शामिल करने के बारे में सोचना है ... – Pete

+0

हालांकि दूसरे विचार पर: मैं कैसे पहुंच सकता हूं वह एलियाज्ड गिनती() कॉलम? – Pete

+0

उपनाम गणना कॉलम के लिए पथ पथ का उपयोग करें (पथ उपनाम, subQuery.as (उपनाम), और उसके बाद उपनाम का उपयोग करें) –

संबंधित मुद्दे