2010-03-01 8 views
53

मैं हाल ही में सीखा है कि यह JPQL बयान में नई वस्तुओं बनाने के लिए इस प्रकार संभव है:जेपीक्यूएल स्टेटमेंट का चयन करने में नया ऑब्जेक्ट बनाएं - से बचें या गले लगाओ?

select new Family(mother, mate, offspr) 
from DomesticCat as mother 
    join mother.mate as mate 
    left join mother.kittens as offspr 

से परहेज किया या बल्कि गले लगाने के लिए यह कुछ है? इस प्रथा का उपयोग कब अच्छे प्रथाओं के प्रकाश में उचित है?

उत्तर

91

से बचने मत करो यह, चयन नई नहीं है क्योंकि वहाँ इसके लिए पूरी तरह से वैध उपयोग के मामलों के रूप में §10.2.7.2 में याद दिलाया है।

एक निर्माता चयन सूची में इस्तेमाल किया जा सकता एक या अधिक जावा उदाहरणों वापस जाने के लिए: का चयन करें खण्ड EJB 3.0 JPA Specification की में JPQL निर्माता भाव। निर्दिष्ट कक्षा एक इकाई होने के लिए या डेटाबेस में मैप किए गए होने की आवश्यकता नहीं है। कन्स्ट्रक्टर का नाम पूरी तरह से योग्य होना चाहिए।

एक इकाई वर्ग के नाम का चयन करें नई खंड में निर्दिष्ट है, तो जिसके परिणामस्वरूप इकाई उदाहरणों नए राज्य में हैं।

SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count) 
FROM Customer c JOIN c.orders o 
WHERE o.count > 100 

संक्षेप में, का चयन करें नई का उपयोग जब आप एक पूर्ण इकाई या एक प्रकार सुरक्षित तरीका में वस्तुओं की एक पूरी ग्राफ (के रूप में एक Object[] के खिलाफ) को पुनः प्राप्त करने नहीं करना चाहती। चाहे आप किसी इकाई वर्ग या गैर मैप किए गए वर्ग में किसी क्वेरी का परिणाम मैप करते हैं, वह आपके चयन पर निर्भर करेगा। एक सामान्य उदाहरण एक सूची स्क्रीन होगी (जहां आप सभी विवरण नहीं चाहते हैं)।

दूसरे शब्दों में, इसे हर जगह उपयोग न करें, लेकिन इसका उपयोग न मनाएं (कुछ चीजें केवल काले या सफेद हैं)।

+0

मैं वही काम करना चाहता हूं लेकिन मेरी पूछताछ में मेरे पास कुछ शामिल हो गए हैं और जेपीए शिकायत करते हैं: 'निर्दिष्ट प्रश्न पूछने में शामिल है, लेकिन प्राप्त सूची का मालिक चुनिंदा सूची में मौजूद नहीं था'। दुख ... –

+1

कृपया अपना उत्तर संपादित करें और "कन्स्ट्रक्टर का नाम पूरी तरह से योग्य होना चाहिए" बोल्ड .. यह बहुत महत्वपूर्ण है और त्रुटियों का एक आम स्रोत है। –

+1

उत्तर पूरी तरह से सही है, लेकिन जुड़ा हुआ दस्तावेज़ उत्तर से मेल नहीं खाता है। यह http://jcp.org/aboutJava/communityprocess/final/jsr317/index होना चाहिए।एचटीएमएल – Pumuckline

24

जब आप डेटा ट्रांसफर ऑब्जेक्ट पुनर्प्राप्त करना चाहते हैं तो आप अक्सर इस तरह की क्वेरी का उपयोग करते हैं। शायद एक रिपोर्ट इसका उपयोग करने के लिए एक अच्छी जगह हो सकती है। यदि आप केवल एक डोमेन ऑब्जेक्ट पुनर्प्राप्त करना चाहते हैं (जैसे परिवार इसके बजाय), इसलिए इसका उपयोग करने का कोई कारण नहीं है।

+3

+1 डीटीओ का उल्लेख करने के लिए +1 - बिल्कुल मेरा उपयोग केस –

+1

अच्छा बिंदु, लेकिन क्या आपको लगता है कि रिपोजिटरी को डीटीओ वापस करना चाहिए, न कि संस्थाएं? मैं सामान्य रूप से सेवा परत में वस्तुओं को परिवर्तित कर रहा हूं, रिपोजिटरी में बहुत जल्दी नहीं है? – Mejmo

5

नए के साथ बनाई गई वस्तु को डीटीओ नहीं होना चाहिए, यानी एक ऑब्जेक्ट जिसे बिजनेस लेयर द्वारा निर्यात किया जाएगा। यह एक POJO डोमेन ऑब्जेक्ट भी हो सकता है, यानी व्यवसाय परत द्वारा आंतरिक रूप से उपयोग किया जाने वाला ऑब्जेक्ट।

पूर्ण जेपीए इकाई के बजाय आंशिक वस्तु के रूप में इस तरह के पीओजेओ का उपयोग करने का कारण विशिष्ट प्रकार के जॉइन में प्रदर्शन है। एक महान संसाधन जो यह समझाता है: http://use-the-index-luke.com/sql/join/hash-join-partial-objects

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