2010-09-03 17 views
10

क्या जेपीए 2 में रिकर्सिव क्वेरी चलाने के लिए कोई तंत्र है?रिकर्सिव जेपीए क्वेरी?

यहां मेरी स्थिति है: मेरे पास एक इकाई ई है, जिसमें एक पूर्णांक फ़ील्ड x है। इसमें टाइप ई के बच्चे भी हो सकते हैं, जो @OneToMany के माध्यम से मैप किए जाते हैं। मैं जो करना चाहता हूं वह प्राथमिक कुंजी द्वारा ई ढूंढता है, और इसके सभी वंशजों के एक्स मानों के साथ एक्स का मान प्राप्त करता है। क्या एक प्रश्न में ऐसा करने का कोई तरीका है?

मैं हाइबरनेट 3.5.3 का उपयोग कर रहा हूं, लेकिन मैं हाइबरनेट एपीआई पर कोई स्पष्ट निर्भरता नहीं लेना चाहता हूं।


संपादित करें: this आइटम के अनुसार, हाइबरनेट नहीं इस सुविधा है, या कम से कम यह मार्च में नहीं किया है। तो ऐसा लगता है कि जेपीए के पास यह होगा, लेकिन मैं यह सुनिश्चित करना चाहता हूं।

उत्तर

21

सरल एडजैसीसी मॉडल का उपयोग करके जहां प्रत्येक पंक्ति में उसके माता-पिता का संदर्भ होता है जो एक ही तालिका में एक और पंक्ति का संदर्भ लेता है, जेपीए के साथ सह-संचालन नहीं करता है। ऐसा इसलिए है क्योंकि जेपीए को क्लॉज या एसक्यूएल मानक के साथ ओरेकल कनेक्ट का उपयोग करके प्रश्न उत्पन्न करने के लिए समर्थन नहीं है। उन 2 खंडों में से किसी के बिना एडजेंसी मॉडल को उपयोगी बनाना वास्तव में संभव नहीं है।

हालांकि, इस समस्या को हल करने के लिए कुछ अन्य दृष्टिकोण हैं जो इस समस्या पर लागू हो सकते हैं। पहला सामग्रीकृत पथ मॉडल है। यह वह जगह है जहां नोड का पूरा पथ एक स्तंभ में चपटा हुआ है। तालिका परिभाषा इतनी तरह बढ़ा दिया गया है:

CREATE TABLE node (id INTEGER, 
        path VARCHAR, 
        parent_id INTEGER REFERENCES node(id)); 

नोड्स के एक पेड़ सम्मिलित करने के लिए जैसे कुछ बात दिखता है:

INSERT INTO node VALUES (1, '1', NULL); -- Root Node 
INSERT INTO node VALUES (2, '1.2', 1); -- 1st Child of '1' 
INSERT INTO node VALUES (3, '1.3', 1); -- 2nd Child of '1' 
INSERT INTO node VALUES (4, '1.3.4', 3); -- Child of '3' 

तो नोड '1' और इसके सभी प्राप्त करने के लिए क्वेरी है:

SELECT * FROM node WHERE id = 1 OR path LIKE '1.%'; 

इसे जेपीए में मैप करने के लिए बस 'पथ' कॉलम को अपनी सतत वस्तु का एक गुण बनाएं। हालांकि आपको 'पथ' फ़ील्ड को अद्यतित रखने के लिए पुस्तक-पालन करना होगा। जेपीए/हाइबरनेट आपके लिए यह नहीं करेगा। जैसे यदि आप नोड को किसी भिन्न माता-पिता में ले जाते हैं तो आपको मूल संदर्भ दोनों को अपडेट करना होगा और नए पैरेंट ऑब्जेक्ट से नया पथ मान निर्धारित करना होगा।

अन्य दृष्टिकोण को नेस्टेड सेट मॉडल कहा जाता है, जो थोड़ा अधिक जटिल है। संभवत: described इसके उत्प्रेरक द्वारा (मेरे द्वारा अतिरिक्त वर्बैटिम के बजाय)।

नेस्टेड अंतराल मॉडल नामक एक तीसरा दृष्टिकोण है, हालांकि इसे लागू करने के लिए संग्रहीत प्रक्रियाओं का भारी निर्भरता है।

The Art of SQL के अध्याय 7 में इस समस्या का एक और अधिक पूर्ण स्पष्टीकरण वर्णित है।

+0

यह सब बल्कि अधिक मैं क्या देख रहा था की तुलना में जटिल है, लेकिन जानकारीपूर्ण प्रतिक्रिया के लिए धन्यवाद। भौतिकीकृत पथ मॉडल के लिए एक आसान विकल्प भी है - प्रत्येक नोड पेड़ के रूट नोड की आईडी संग्रहीत करता है जो यह संबंधित है। इसका मतलब यह है कि आप केवल रूट नोड का उपयोग क्वेरी के शुरुआती बिंदु के रूप में कर सकते हैं, लेकिन मेरे विशिष्ट मामले में यह कोई समस्या नहीं है - तो शायद यह है कि मैं क्या करूँगा। –

+0

आप जेपीए के माध्यम से प्रबंधित आसन्नता सूचियों का उपयोग कर सकते हैं, लेकिन पुनरावर्ती एसक्यूएल सुविधाओं का उपयोग करने के लिए मूल क्वेरी का उपयोग कर सकते हैं। यह थोड़ा सा मुश्किल होगा, और पोर्टेबल नहीं होगा, लेकिन यह दोनों दुनिया के सर्वश्रेष्ठ में से कुछ होगा। नेस्टेड सेट पोर्टेबल हैं, लेकिन विचित्र रूप से, और कुछ सामान्य प्रकार के प्रश्नों के लिए बहुत अच्छा प्रदर्शन नहीं करते हैं। –

+0

जेपीए 2.0 के साथ कुछ भी बदल गया है ... उदाहरण के लिए, मैंने अपनी क्वेरी में 'कनेक्ट बाय' क्लॉज रखने के लिए मूल नामांकितQuery का उपयोग किया है। मैंने कोशिश की है और यह बच्चों को वापस कर देता है, लेकिन एक हास्यास्पद सूची रूप में नहीं ... बस फ्लैट बच्चों। कोई विचार? – SoftwareSavant

4

इस पोस्ट का सबसे अच्छा जवाब मेरे लिए एक विशाल काम-आसपास हैक जैसा लगता है। मुझे पहले से ही डेटा मॉडल से निपटना पड़ा है जहां शानदार इंजीनियरों ने फैसला किया कि यह डीबी क्षेत्रों में ट्री हाइलाइज़ियों को कोड करने के लिए एक अच्छा विचार होगा जैसे कि: "यूरोप | यूके | शॉप 1 | जॉन" और इन तालिकाओं में भारी मात्रा में डेटा के साथ । आश्चर्य की बात नहीं है, फार्म MyHackedTreeField जैसे 'parentHierharchy%' की क्वेरी का प्रदर्शन जहां हत्यारों। इस प्रकार की समस्या को संबोधित करने के लिए आखिरकार पेड़ hiearchies के स्मृति कैश में और कई अन्य लोगों को बनाने की आवश्यकता है ...

आप एक पुनरावर्ती पूछताछ चलाने की आवश्यकता है और अपने डेटा की मात्रा में बड़े पैमाने पर नहीं है, तो ... अपने जीवन को सरल बनाने और बस डीबी क्षेत्रों आप अपनी योजना को चलाने के लिए की जरूरत है लोड। और जावा में अपने रिकर्सन कोड। इसे डीबी में न बनाएं जब तक कि आपके पास ऐसा करने का कोई अच्छा कारण न हो।

और यहां तक ​​कि यदि आपके पास डेटा की मात्रा बहुत अधिक है, तो संभवतः आप अपनी समस्या को अपरिवर्तनीय रिकर्सिव पेड़ बैचों में विभाजित कर सकते हैं और एक बार में सभी डेटा लोड करने की आवश्यकता के बिना उनको संसाधित कर सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^